Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MSXML:当我试图删除无效字符时,它有时会得到;";_Xml_Vba_Vb6_Msxml - Fatal编程技术网

MSXML:当我试图删除无效字符时,它有时会得到;";

MSXML:当我试图删除无效字符时,它有时会得到;";,xml,vba,vb6,msxml,Xml,Vba,Vb6,Msxml,我需要解析包含大量无效字符的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

我需要解析包含大量无效字符的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
Dim xmldoc作为MSXML2.DOMDocument
将xmlNode设置为MSXML2.IXMLDOMNode
Dim xmlNodeList作为MSXML2.IXMLDOMNodeList
将XML设置为字符串
作为整数的dim-fno
'获取XML文件
fno=FreeFile
打开“input.xml”以输入为#fno
XML=输入(LOF(fno),fno)
关闭#fno
_代码的顶部_:
设置xmldoc=New MSXML2.DOMDocument60
xmldoc.LoadXML
设置xmlNodeList=xmldoc.getElementsByTagName(“*”)
对于xmlNodeList中的每个xmlNode
(一组解析XML的代码)
下一个xmlNode
如果xmldoc.parseError.errorCode 0和xmldoc.parseError.reason=“在文本内容中发现无效字符。”&vbCrLf,则
'找到无效字符
ptr=xmldoc.parseError.filepos
XML=Left(XML,ptr-1)和“x”和Mid(XML,ptr+1)
设置xmldoc=Nothing
转到代码的顶部
如果结束
大部分时间代码都完全按照预期工作:迭代删除每个无效字符,然后进行解析。然而,有时事情似乎变得“卡住”:每次它在同一位置检测到无效字符时,即使在我用有效字符替换无效字符之后。我尝试插入各种字符来替换无效的字符,并且简单地删除了该字符的位置。我仍然在同一个位置收到一个无效字符错误。有什么线索吗?

我不会打开“作为输入”的文件。相反,我将以“二进制”方式打开它,分配一个缓冲区:Redim abytData(1到Lof(fno)),并使用Get#fno,abytData()将数据拉入缓冲区。这意味着VB不会对数据进行任何处理。然后应该使用各种基于“B”字节的字符串函数版本,例如InStrB(),来处理数据

然后,我会尽可能多地进行预处理,在解析XML之前删除无效字符,而不是依赖XML解析器来完成,这是一种低效的机制


你能举个例子说明你发现了哪些无效字符吗?

这看起来不像真正的代码。例如,您
设置xmldoc=Nothing
,然后
转到代码的顶部。但在代码顶部发生的第一件事是xmldoc.LoadXML XML,这将导致“未设置对象或块”。请发布一个更好的示例。请将
(一组解析XML的代码)
替换为您用来替换无效字符的代码。在减少发布示例时,我省略了一些基本代码。对不起,你从哪里得到这个文件的?您读取它的方式假定它是针对当前系统语言环境和代码页编码的ANSI数据。您是否考虑过文件中的实际编码可能是UTF-8?如果是这样的话,那么以你现在的方式阅读它将是不可靠的,它“大部分时间”都在工作,但在遇到非ASCII符号时会失败。我还将努力摆脱使用这些慢变量字符串函数的习惯。把工作做好只需要很少的努力。