VBA Excel: XML, получить определенный узел - PullRequest
0 голосов
/ 10 сентября 2018

У меня проблема с выбором определенных узлов в XML.XML выглядит следующим образом:

<?xml version="1.0"?>
<GetConfigurationItems Error="False">
    <ConfigurationItem ID="14" Deleted="0">
        <AttachmentTypes DropDownType="14" Filter="%" Deleted="0">
            <AttachmentType ShortDesc="BOA_FIT" VersionNo="2" ID="1D8651D1-99E2-4D77-9BFF-1A667AA9398D">FIT</AttachmentType>
            <AttachmentType ShortDesc="BOA_LIMS" VersionNo="3" ID="F543938A-693F-457A-97AA-010065D0BA4E">Lims</AttachmentType>
            <AttachmentType ShortDesc="BOA_MICRO_PIC" VersionNo="1" ID="CC3FB18D-1E3F-400A-AD52-971A78A5517D">Microscope picture</AttachmentType>
        </AttachmentTypes>
    </ConfigurationItem>
</GetConfigurationItems>

Теперь я хочу сохранить атрибут ID, НО из определенного значения, для начала давайте просто возьмем FIT.Я пробовал так много вариантов, я действительно не знаю, что я делаю неправильно .. :( С этим кодом я получаю XML от веб-службы:

Webservice = "http://xxx.xxx.xxx/mm/rm/webservice/RMWS_ConfigurationRead.asmx?wsdl"

    functionName = "GetConfigurationItems"
    portName = "RMWS_ConfigurationReadSoap"
    Set DMIService = New DMIService
    Set oXML = CreateObject("msxml2.DOMDocument.6.0")
    oXML.LoadXML DMIService.execute(Webservice, functionName, portName, "<![CDATA[<GetConfigurationItems><ConfigurationItem ID=""" & ID & """ Deleted=""0""/></GetConfigurationItems>]]>")

Так вот некоторые из попыток строки подключения (разные попытки bsp1):

    //GetConfigurationItems/ConfigurationItem[@ID="14"]/AttachmentTypes/AttachmentType[text="FIT"]/@ID
    //GetConfigurationItems/ConfigurationItem[@ID="14"]/AttachmentTypes[AttachmentType="FIT"]/@ID
    //GetConfigurationItems/ConfigurationItem[@ID="14"]/AttachmentTypes/[AttachmentType="FIT"]/@ID
    //GetConfigurationItems/ConfigurationItem[@ID="14"]/AttachmentTypes[AttachmentType[@Name="FIT"]/@ID
    //GetConfigurationItems/ConfigurationItem[@ID="14"]/AttachmentTypes[AttachmentType="FIT"]/@ID

ID = oXML.SelectSingleNode(bsp1).Text

Я совершенно уверен, что это просто небольшая ошибка, но я сейчас пытаюсь слишком долго .. Так что было бы неплохо, если кто-то может мне помочь ..

С наилучшими пожеланиями luca

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Вот что мне удалось построить:

Option Explicit
Sub TestMe()

    Dim xmlObj As Object
    Set xmlObj = CreateObject("MSXML2.DOMDocument")

    xmlObj.async = False
    xmlObj.validateOnParse = False
    xmlObj.Load (ThisWorkbook.Path & "\someXML.xml")

    Dim nodesThatMatter As Object
    Dim node            As Object
    Set nodesThatMatter = xmlObj.SelectNodes("//GetConfigurationItems")

    Dim level1 As Object
    Dim level2 As Object
    Dim level3 As Object
    Dim level4 As Object

    For Each level1 In nodesThatMatter
        For Each level2 In level1.ChildNodes
            For Each level3 In level2.ChildNodes
                For Each level4 In level3.ChildNodes
                    With level4
                        If .Attributes(0).Value Like "*FIT*" Then
                            Debug.Print "OK " & .Attributes(0).Value & .Attributes(2).Value
                        Else
                            Debug.Print "IGNORE " & .Attributes(0).Value
                        End If
                        Debug.Print .Text & vbCrLf
                    End With
                Next level4
            Next level3
        Next level2
    Next level1

End Sub

При этом в ближайшем окне:

OK BOA_FIT1D8651D1-99E2-4D77-9BFF-1A667AA9398D
FIT

IGNORE BOA_LIMS
Lims

IGNORE BOA_MICRO_PIC
Microscope picture

Идея состоит в том, чтобы использовать Watches window как можно больше и, таким образом, использовать атрибуты. Я начал с верхнего уровня - //GetConfigurationItems и пошел вниз по течению, просматривая каждый из них.

0 голосов
/ 10 сентября 2018

Это похоже на работу. Я читаю ваш образец XML из файла.

Option Explicit
Public Sub GetNode()
    Dim xmlDoc      As MSXML2.DOMDocument60
    Set xmlDoc = New MSXML2.DOMDocument60
    xmlDoc.async = False
    xmlDoc.validateOnParse = True

    If Not xmlDoc.Load("C:\Users\User\Desktop\Testing.xml") Then
        MsgBox "Problem"
        Exit Sub
    End If
    Debug.Print xmlDoc.SelectSingleNode("//AttachmentType[text()='FIT']").Attributes.getNamedItem("ID").Text
End Sub

Или

Debug.Print xmlDoc.SelectSingleNode("//*[text()='FIT']").Attributes.getNamedItem("ID").Text
...