VBA Excel: цикл по атрибутам XML - PullRequest
       4

VBA Excel: цикл по атрибутам XML

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

Я на самом деле строю программу в Excel для ввода данных в текстовый документ из веб-службы. Поскольку XML построен странным образом, я должен пройтись по атрибутам узла, чтобы создать список. Из этого списка я создам таблицу.

Моя проблема в этом цикле, я покажу вам код:

    ConnectionString = "//GetConfigurationItems/ConfigurationItem/AttachmentTypes/AttachmentType"
tblFilter = "1D8651D1-99E2-4D77-9BFF-1A667AA9398D"
id = "14"

            Set valuesOXML = CreateObject("msxml2.DOMDocument.4.0")
            valuesOXML.LoadXML DMIService.execute(Webservice, functionName, portName, "<![CDATA[<GetConfigurationItems><ConfigurationItem ID=""" & ID & """ Filter=""" & tblFilter & """ Deleted=""0""/></GetConfigurationItems>]]>")

            Set fourthNameField = valuesOXML.SelectNodes(ConnectionString)
            For Each ftfield In fourthNameField
                werte = werte & ftfield.Attributes(0).Text & ";"

                Dim x As Integer
                For x = 0 To ftfield.Attributes.Item - 1
                     Debug.Print ftfield.Attributes.Item(x)
                Next x
            Next ftfield

Команда сохранения переменной werte работает. но цикл через атрибуты завершается неудачно с текстом ошибки:

"Объект не поддерживает это свойство или метод".

XML выглядит так:

<?xml version="1.0"?>
<GetConfigurationItems Error="False">
    <ConfigurationItem ID="14" Filter="1D8651D1-99E2-4D77-9BFF-1A667AA9398D" Deleted="0">
        <AttachmentTypes DropDownType="14" Filter="1D8651D1-99E2-4D77-9BFF-1A667AA9398D" Deleted="0">
            <AttachmentType ShortDesc="BOA_FIT" VersionNo="2" ID="1D8651D1-99E2-4D77-9BFF-1A667AA9398D">FIT</AttachmentType>
        </AttachmentTypes>
    </ConfigurationItem>
</GetConfigurationItems>

Ответы [ 2 ]

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

попробуйте это (работает в VBA, используя XML как строку)

Я добавил библиотеку MSXML2 в качестве справочника (Инструменты> Ссылки> Microsoft XML, v6.0) **

Dim valuesOXML As MSXML2.DOMDocument60 

Dim ConnectionString As String
Dim fourthNameField As IXMLDOMNodeList
Dim ftfield As IXMLDOMNode
Dim werte As String

ConnectionString = "//GetConfigurationItems/ConfigurationItem/AttachmentTypes/AttachmentType"

Set valuesOXML = CreateObject("Msxml2.DOMDocument.6.0")

valuesOXML.LoadXML  DMIService.execute(Webservice, functionName, portName, "<![CDATA[<GetConfigurationItems><ConfigurationItem ID=""" & ID & """ Filter=""" & tblFilter & """ Deleted=""0""/></GetConfigurationItems>]]>")

Set fourthNameField = valuesOXML.SelectNodes(ConnectionString)
For Each ftfield In fourthNameField
    werte = werte & ftfield.Attributes(0).Text & ";"

    Dim x As Integer
    For x = 0 To ftfield.Attributes.Length - 1
         Debug.Print ftfield.Attributes.Item(x).Text
    Next x
Next ftfield
End Sub
0 голосов
/ 07 сентября 2018

Вы не делаете эквивалент следующего? Замените мою загрузку из файла вашим кодом подключения.

Option Explicit
Public Sub testing()
    Dim xmlDoc As New MSXML2.DOMDocument60, mainNode As Object, Node As Object, child As Object, child2 As Object
    Set xmlDoc = New MSXML2.DOMDocument60
    xmlDoc.Load "C:\Users\User\Desktop\Test.xml"
    Set mainNode = xmlDoc.SelectNodes("//GetConfigurationItems")

    For Each Node In mainNode
        For Each child In Node.ChildNodes
            Debug.Print child.BaseName & " :" & child.Text
            For Each child2 In child.ChildNodes
               Debug.Print child2.BaseName & " : " & child2.Text
            Next
        Next
    Next Node
End Sub

С атрибутами:

Option Explicit
Public Sub testing()
    Dim xmlDoc As New MSXML2.DOMDocument60, mainNode As Object, Node As Object, child As Object, child2 As Object, i As Long
    Set xmlDoc = New MSXML2.DOMDocument60
    xmlDoc.Load "C:\Users\User\Desktop\Test.xml"
    Set mainNode = xmlDoc.SelectNodes("//GetConfigurationItems")

    For Each Node In mainNode
        For Each child In Node.ChildNodes
            If child.Attributes.Length > 0 Then
                For i = 0 To child.Attributes.Length - 1
                    Debug.Print child.BaseName & " : " & child.Attributes(i).nodeName & " - " & child.Attributes(i).NodeValue; ""
                Next
            End If
            For Each child2 In child.ChildNodes
                If child2.Attributes.Length > 0 Then
                For i = 0 To child2.Attributes.Length - 1
                    Debug.Print child2.BaseName & " : " & child2.Attributes(i).nodeName & " - " & child2.Attributes(i).NodeValue
                Next
            End If
            Next
        Next
    Next Node
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...