Msxml2.DOMDocument.6.0加载XML时忽略<CALC_FUNC>节点内容方法咨询
Msxml2.DOMDocument.6.0 加载含非法内容XML的解决方案
Msxml2.DOMDocument.6.0 本身没有提供原生配置项支持「加载时自动忽略指定标签区间内容」,但可以通过搭配SAX事件驱动解析的方案实现需求,全程不需要手动修改原始XML文本字符串,完全兼容VBScript、VBA以及NI Diadem运行环境。
实现思路
通过SAXReader流式扫描XML文件流,检测到<CALC_FUNC>开始标签后,直接跳过该节点下所有内容直到遇到</CALC_FUNC>结束标签,其余合规内容正常输出到新的DOMDocument对象,不会触发非法内容的格式校验报错。
通用实现代码(VBScript/VBA通用)
Dim objSAXReader, objXMLWriter, objCleanDOM ' 实例化所需的XML组件 Set objSAXReader = CreateObject("Msxml2.SAXXMLReader.6.0") Set objXMLWriter = CreateObject("Msxml2.MXXMLWriter.6.0") Set objCleanDOM = CreateObject("Msxml2.DOMDocument.6.0") Dim skipContent skipContent = False ' 标记是否跳过当前节点内容 ' 配置XML写入器参数 objXMLWriter.omitXMLDeclaration = False objXMLWriter.indent = True Set objSAXReader.contentHandler = objXMLWriter Set objSAXReader.dtdHandler = objXMLWriter Set objSAXReader.errorHandler = objXMLWriter ' 自定义节点开始事件 Sub objSAXReader_startElement(strNamespaceURI, strLocalName, strQName, objAttributes) If LCase(strLocalName) = "calc_func" Then skipContent = True ' 可选:需要保留空<CALC_FUNC>节点则保留下行,不需要直接注释 objXMLWriter.startElement strNamespaceURI, strLocalName, strQName, objAttributes Exit Sub End If If Not skipContent Then objXMLWriter.startElement strNamespaceURI, strLocalName, strQName, objAttributes End If End Sub ' 自定义节点结束事件 Sub objSAXReader_endElement(strNamespaceURI, strLocalName, strQName) If LCase(strLocalName) = "calc_func" Then skipContent = False ' 可选:对应上面的保留空节点配置 objXMLWriter.endElement strNamespaceURI, strLocalName, strQName Exit Sub End If If Not skipContent Then objXMLWriter.endElement strNamespaceURI, strLocalName, strQName End If End Sub ' 自定义文本内容处理事件 Sub objSAXReader_characters(strChars) If Not skipContent Then objXMLWriter.characters strChars End If End Sub ' 流式读取原始XML文件 objSAXReader.parseURL "C:\你的\XML\文件\路径.xml" ' 替换为实际文件路径 ' 加载处理后的合规内容到DOM对象 objCleanDOM.loadXML objXMLWriter.output ' 校验加载结果 If objCleanDOM.parseError.errorCode = 0 Then ' 后续可正常操作objCleanDOM对象 MsgBox "XML加载成功" Else MsgBox "加载错误:" & objCleanDOM.parseError.reason End If
注意事项
- 方案全程流式读取原始XML文件,不需要把整个文件内容加载为字符串做替换,避免大文件内存占用问题,完全符合不直接操作文本字符串的要求
- 如果不需要保留空的
<CALC_FUNC>节点,注释掉代码中对应位置的startElement和endElement调用即可 - 可根据需要调整标签匹配逻辑,支持同时忽略多个存在不规范内容的节点
内容的提问来源于stack exchange,提问作者Russell Senior
相关产品推荐
相关产品推荐

