尝试从标签<NameProduct>
中提取所有产品名称,但是问题是您需要提取所有产品名称,它们仅位于间隔<Product>...<PostAll>
中。 / p>
下面是一个示例XML:
<?xml version="1.0" encoding="UTF-8"?>
<Products>
<Product>
<NameProduct>PRODUCT NAME 1</NameProduct>
<CodeProduct>PRODUCT CODE 1</CodeProduct>
<CodePlant>1111111111111111</CodePlant>
<NameDesc>DESCRIPTION POS 1</NameDesc>
<PostAll>
<Post>
<NameProduct>M1</NameProduct>
<CodeProduct>M1</CodeProduct>
<CodePlant>1</CodePlant>
<NameDesc>??-1</NameDesc>
</Post>
<Post>
<NameProduct>M2</NameProduct>
<CodeProduct>M2</CodeProduct>
<CodePlant>2</CodePlant>
<NameDesc>??-2</NameDesc>
</Post>
</PostAll>
</Product>
<Product>
<NameProduct>PRODUCT NAME 2</NameProduct>
<CodeProduct>PRODUCT CODE 2</CodeProduct>
<CodePlant>2222222222222222</CodePlant>
<NameDesc>DESCRIPTION POS 2</NameDesc>
<PostAll>
<Post>
<NameProduct>M3</NameProduct>
<CodeProduct>M3</CodeProduct>
<CodePlant>3</CodePlant>
<NameDesc>??-3</NameDesc>
</Post>
<Post>
<NameProduct>M4</NameProduct>
<CodeProduct>M4</CodeProduct>
<CodePlant>4</CodePlant>
<NameDesc>??-4</NameDesc>
</Post>
</PostAll>
</Product>
</Products>
下面是示例代码:
Dim node
Dim nodes
Dim query
Dim xml
Dim i
Dim attrs
Dim ConfigFile
Set xml = CreateObject("Msxml2.DOMDocument.3.0")
ConfigFile = "C:\ProgramData\xmlfile.xml" ' Configuration file path
Dim ok
ok = xml.Load(ConfigFile)
If (Not ok) Then
MsgBox("File configuration failed!")
Exit Sub
Else
xml.SetProperty "SelectionLanguage", "XPath"
query = "NameProduct"
Set nodes = xml.SelectNodes(query)
“ XPath”方法对我不起作用,显然是由于XML缺少属性名称。
告诉我如何以给定间隔XML返回所有匹配项?
答案 0 :(得分:3)
您的XPath表达式不起作用,因为它与您认为的不匹配。查询NameProduct
不会在XML结构的任何位置找到<NameProduct>
节点,而只会在当前节点(您的情况下是文档根节点)下找到。由于<NameProduct>
下没有<Products>
个节点,因此您得到的结果集为空。缺少属性与它无关。
您想要的是XPath表达式//Product/NameProduct
(找到<NameProduct>
个节点,它们是文档中任何位置的<Product>
个节点的直接子节点):
query = "//Product/NameProduct"
Set nodes = xml.selectNodes(query)
双斜杠本质上是指“下方任何地方”。
请仔细阅读XPath的工作原理。
请注意:Msxml2.DOMDocument.3.0
有问题,不应再使用。请改用Msxml2.DOMDocument.6.0
。另外,您可能希望禁用XML文件的异步加载,以确保在开始处理文档之前已完全加载该文档:
Set xml = CreateObject("Msxml2.DOMDocument.6.0")
xml.Async = False
ok = xml.Load("C:\ProgramData\xmlfile.xml")