You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 11:36:02