VBA - 获取标签名称的 XPath 语法是什么

VBA - What's The XPath Syntax To Get Tag Names

我正在尝试使用 VBA 宏来解析 XML 文件。给出以下结构:

  <bookstore>
  <book category="children">
    <title>Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
  <book category="web">
    <title>Learning XML</title>
    <author>Erik T. Ray</author>
    <year>2003</year>
    <price>39.95</price>
  </book>
  </bookstore>

如何枚举带有元素标签的输出及其相应的值,如下所示?

book | category | children
title | harry potter
author | J K. Rowling
...

我的代码如下:

Set xmlFile = CreateObject("Microsoft.XMLDOM")
xmlFile.Load (file)
Set qXML = xmlFile.SelectNodes("/bookstore")
For i = 0 To qXML.Length - 1
  Debug.Print CStr(qXML(i).Text)
Next i

我建议使用早期绑定。 因此,在 VBE 的项目中添加对 Microsoft XML, v6.0.

的引用(菜单 tools/references

要确定您可以使用的属性和值:

Dim xmlFile As MSXML2.DOMDocument60
Set xmlFile = New MSXML2.DOMDocument60

xmlFile.Load file

Dim qXML As MSXML2.IXMLDOMNodeList
Set qXML = xmlFile.SelectNodes("/bookstore/book")

Dim index As Long
For index = 0 To qXML.Length - 1
    Debug.Print qXML(index).SelectSingleNode("@category").Text
    Debug.Print qXML(index).SelectSingleNode("title").Text
    Debug.Print qXML(index).SelectSingleNode("author").Text
Next index

如何获取标签名称

"What's the XPath syntax to get Tag Names?"

严格来说,它是 (XML)DOM 语法来获取 .Name and/or .NodeName 属性; XMLDOM(文档对象模型) 是一个跨平台且独立于语言的接口,将文档视为树结构并允许以编程方式访问树。

但是,您可以使用 XPath 表达式的特殊语法(例如 "/bookstore/book/title")来处理分层 xml 文档结构中的任何逻辑部分.

所以接近您的 OP 的解决方案是:

Option Explicit             ' declaration head of your code module

Sub ExampleCall()
    Dim file As String: file = ThisWorkbook.Path & "\xml\bookstore.xml"
    Dim xmlFile As Object
    Set xmlFile = CreateObject("Microsoft.XMLDOM")
    If xmlFile.Load(file) Then
        Dim qXML As Object
        Set qXML = xmlFile.DocumentElement.SelectNodes("book")
        Dim q As Object
        For Each q In qXML
            Dim cnt As Long: cnt = cnt + 1
            Debug.Print Format(cnt, "--- 000 ---")
            Debug.Print q.Attributes(0).Name, "|" & q.Attributes(0).Text
            Dim i As Long
            For i = 0 To q.ChildNodes.Length - 1
                Debug.Print q.ChildNodes(i).nodeName, "|" & q.ChildNodes(i).Text
            Next
        Next
    End If
End Sub

VBE 的立即结果 window

--- 01 ---
category      |children
title         |Harry Potter
author        |J K. Rowling
year          |2005
price         |29.99
--- 02 ---
category      |web
title         |Learning XML
author        |Erik T. Ray
year          |2003
price         |39.95

旁注

由于 Microsoft.XMLDOM 已被弃用多年, 我更喜欢在最新的 xml 版本 Microsoft XML,v6.0 中绑定到 ►MSXML2,例如通过

我。后期绑定(如 OP)

    Dim xDoc As Object
    Set xDoc = CreateObject("MSXML2.DOMDocument.6.0")

二.早期绑定

    Dim xDoc As MSXML2.DOMDocument60     ' *) whereas MSXML2.DOMDocument (=old version 3.0)
    Set xDoc = New MSXML2.DOMDocument60  ' mind the missing point in digits

旁注:OP 使用对象变量 XMLFile 而不是 xDoc

注意 在没有明显版本控制的情况下引用 DOMDocument 将默认在内部绑定到 3.0 (6.0之前的最后一个稳定版本,其他版本弃用)。

更多链接

  • Obtain attribute names from xml using VBA