用VBS解析.xml

时间:2019-04-03 07:27:47

标签: xml parsing vbscript

尝试从标签<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返回所有匹配项?

1 个答案:

答案 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")