0

無効な文字が多数含まれている XML ファイルを解析する必要があります。ファイルを解析して無効な文字を置き換えるために使用する VB6/VBA コードを次に示します。

Dim xmldoc As MSXML2.DOMDocument
Dim xmlNode As MSXML2.IXMLDOMNode
Dim xmlNodeList As MSXML2.IXMLDOMNodeList
dim XML as string
dim fno as integer

' get the XML file
fno = FreeFile
Open "input.xml" For Input As #fno
XML = Input(LOF(fno), fno)
Close #fno

TOP_OF_CODE:
Set xmldoc = New MSXML2.DOMDocument60
xmldoc.LoadXML XML
Set xmlNodeList = xmldoc.getElementsByTagName("*")
For Each xmlNode In xmlNodeList

    (a bunch of code to parse the XML)

Next xmlNode

If xmldoc.parseError.errorCode <> 0 And xmldoc.parseError.reason = "An invalid character was found in text content." & vbCrLf Then
    ' invalid character was found
    ptr = xmldoc.parseError.filepos
    XML = Left(XML, ptr - 1) & "x" & Mid(XML, ptr + 1)
    set xmldoc = Nothing
    GoTo TOP_OF_CODE
end if

ほとんどの場合、コードは意図したとおりに機能します。無効な文字が繰り返し削除され、解析が行われます。ただし、時々、物事が「スタック」しているように見えます。無効な文字を有効な文字に置き換えた後でも、同じ位置で無効な文字が検出されるたびに。無効な文字を置き換えるためにさまざまな文字を挿入しようとしましたが、その文字位置も単純に削除しました。同じ場所で無効な文字エラーが引き続き発生します。手がかりはありますか?

4

1 に答える 1

1

「入力として」ファイルを開きません。代わりに、「バイナリとして」開き、バッファを割り当てます: Redim abytData(1 To Lof(fno)) を使用し、Get #fno, , abytData() を使用してデータをバッファに取り込みます。これは、VB がデータに対して処理を行わないことを意味します。次に、InStrB() などの文字列関数のさまざまな "B" バイトベース バージョンを使用して、データを処理する必要があります。

次に、非効率的なメカニズムである XML パーサーに頼るのではなく、XML を解析する前に無効な文字を削除するためにできる限り多くの前処理を実行しようとします。

見つけた無効な文字の例を教えてください。

于 2012-08-02T09:15:19.787 に答える