为什么在vba中用最新的XML DOM 对象会无法解析XML?

如下的XML代码位于xl文件夹的workbook.xml文件中

<?xml version="1.0" encoding="utf-8"?>
<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
  <fileVersion appName="xl" lastEdited="5" lowestEdited="5" rupBuild="9303"/>
  <workbookPr defaultThemeVersion="124226"/>
  <workbookProtection workbookPassword="CC40" revisionsPassword="CC40" lockStructure="1" lockRevision="1"/>
  <bookViews>
    <workbookView xWindow="480" yWindow="120" windowWidth="19440" windowHeight="12585"/>
  </bookViews>
  <sheets>
    <sheet name="Sheet1" sheetId="1" r:id="rId1"/>
  </sheets>
  <calcPr calcId="145621"/>
  <customWorkbookViews>
    <customWorkbookView name="xyf" guid="{D5638B0B-396C-4CF2-9C8E-4E6C6243762C}" mergeInterval="0" personalView="1" maximized="1" windowWidth="1276" windowHeight="791" activeSheetId="1"/>
  </customWorkbookViews>
</workbook>

当用如下的代码进行解析:

Sub QQ1722187970()
    sPath = Excel.ThisWorkbook.Path
    '定义一个变量用于存储xml文件
    Dim sPathXml As String
    sPathXml = sPath & "\xl\workbook.xml"
    '定义一个解析xml的变量对象
    Dim oXml As Object
    Set oXml = VBA.CreateObject("Msxml2.DOMDocument.6.0")
    With oXml
        '不异步导入xml源
        .async = False
        '导入xml文件
        .Load (sPathXml)
        '导入xml文本
'        .LoadXML (sXml)
        With .parseError
            If .ErrorCode = 0 Then
                Debug.Print "解析成功"
                '解析成功
                '****************************
                '先找到节点
                Set oNode = oXml.SelectSingleNode("//workbookProtection")
                '删除节点
                oNode.ParentNode.RemoveChild oNode
                '****************************
            Else
                '如果解析错误,输出错误的原因
                Debug.Print .reason
            End If
        End With
    End With
End Sub

oNode变量始终返回nothing,也就是找不到workbookProtection元素节点,始终解析不正确,出错。

经过仔细地分析,原因出在

Set oXml = VBA.CreateObject("Msxml2.DOMDocument.6.0")

这条语句,由于Msxml2.DOMDocument.6.0 生成的是最新版本的DOMDocument60对象,它解析xml文件时,用的是最新的标准,要求XML元素都必须有开始和结束标签。而上述的XML代码是不规则的XML代码,有些元素只有开始标签,没有结束标签。所以导致解析不出。

为此,可以将DOMDocument对象换成以下两种均可正常解析:

Set oXml = VBA.CreateObject("Msxml2.DOMDocument.3.0")
Set oXml = VBA.CreateObject("Microsoft.XMLDOM")

修改后的代码如下:

Sub QQ1722187970()
    Const NODE_ELEMENT = 1
    Const NODE_ATTRIBUTE = 2
    Const NODE_TEXT = 3
    Const NODE_COMMENT = 8
    Const NODE_DOCUMENT = 9
    sPath = Excel.ThisWorkbook.Path
    '定义一个变量用于存储xml文件
    Dim sPathXml As String
    sPathXml = sPath & "\xl\workbook.xml"
    '定义一个解析xml的变量对象
    Dim oXml As Object
'    Set oXml = VBA.CreateObject("Msxml2.DOMDocument.6.0")
    Set oXml = VBA.CreateObject("Msxml2.DOMDocument.3.0")
    Set oXml = VBA.CreateObject("Microsoft.XMLDOM")
    With oXml
        '不异步导入xml源
        .async = False
        '导入xml文件
        .Load (sPathXml)
        '导入xml文本
'        .LoadXML (sXml)
        With .parseError
            If .ErrorCode = 0 Then
                Debug.Print "解析成功"
                '解析成功
                '****************************
                '先找到节点
                Set oNode = oXml.SelectSingleNode("//workbookProtection")
                '删除节点
                oNode.ParentNode.RemoveChild oNode
                '****************************
            Else
                '如果解析错误,输出错误的原因
                Debug.Print .reason
            End If
        End With
    End With
End Sub

 

       

发表评论