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
我正在尝试使用 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