Как использовать XPath в VBA

#xml #vba #xpath

#xml #vba #xpath

Вопрос:

Мой XML-файл выглядит так, как показано ниже.

Я хочу:
выбрать все «идентификаторы», которые находятся в узле «Проблема».
Не выбирать идентификаторы, которые являются элементами подузлов.

Мой подход xml.SelectNodes("/config/entry/content/Issue/id") возвращает пустой список.

Вот XML

 <config> 
    <id>3423</id>
    <Title>Project Overview</Title>
    <entry>
        <id>3423</id>
        <Title>Project Overview</Title>
        <content>
            <Issue>
                <id>3423</id>
                <etc...>....<etc...>
                <hasMappedReleases>
                    <id>4365<id>
                    <etc...>....<etc...>
                </hasMappedReleases>
            </Issue>
        </content>
    </entry>
    <entry>
          ....
          ....

</config>       
  

Ответ №1:

Ваше решение должно работать. Проблема должна быть в другом месте. Я пробовал с этим образцом xml:

 <config> 
    <id>3423</id>
    <Title>Project Overview</Title>
    <entry>
        <id>3423</id>
        <Title>Project Overview</Title>
        <content>
            <Issue>
                <id>3423</id>
                <hasMappedReleases>
                    <id>4365</id>
                </hasMappedReleases>
            </Issue>
        </content>
    </entry>
    <entry>
        <id>3424</id>
        <Title>Project Overview</Title>
        <content>
            <Issue>
                <id>3424</id>
                <hasMappedReleases>
                    <id>4367</id>
                </hasMappedReleases>
            </Issue>
        </content>
    </entry>
</config> 
  

и этот код:

 Sub Main()
    Dim xDoc As XmlDocument
    Dim result As XmlNodeList
    xDoc = New XmlDocument
    xDoc.Load("test.xml")
    result = xDoc.SelectNodes("/config/entry/content/Issue/id")
    Print(result.Count)
End Sub
  

и он напечатал мне count = 2

Вот хорошая ссылка на XPath: https://learn.microsoft.com/en-us/previous-versions/dotnet/netframework-4.0/ms256086(v=vs.100)?redirectedfrom=MSDN

Комментарии:

1. Несколько советов / проблем: а) используйте текущую версию 6.0 через Dim xDoc As MSXML2.DOMDocument60 , б) установите объявленный объект с помощью Set xDoc = New MSXML2.DOMDocument60 ; в) если не используется для проверки логического значения, в результате нет скобок xDoc.Load "test.xml" (укажите точный путь!); г) у NodeList есть .Length свойство для подсчета элементов, г) VBA использует Debug.Print 🙂 @andymeissner