Парсинг .xml с vbs - PullRequest
       1

Парсинг .xml с vbs

0 голосов
/ 03 апреля 2019

Пытается вытащить все названия продуктов из тега <NameProduct>, но проблема в том, что вам нужно вытащить все названия продуктов, которые лежат только в интервале <Product>...<PostAll>.

Ниже приведен пример 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 Ответ

3 голосов
/ 03 апреля 2019

Ваше выражение XPath не работает, потому что оно не соответствует тому, что вы думаете, оно соответствует.Запрос NameProduct не найдет <NameProduct> узлов где-либо в структуре XML, но только под текущим узлом (который в вашем случае является корневым узлом документа).Поскольку в <Products> нет узлов <NameProduct>, вы получаете пустой набор результатов.Отсутствующие атрибуты не имеют к этому никакого отношения.

То, что вам нужно, это выражение 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...