Импорт схемы XML с повторяющимися элементами, но с разными именами атрибутов - PullRequest
0 голосов
/ 21 января 2019

У меня есть следующая схема:

<import>
    <node type="document" action="action">
        <location>Spain:Development</location>
        <title>Abono de factura</title>
        <file>D:\OPENTEXT\12343fewf.pdf</file>
        <category name="Content Server Categories:Non SAP Categories:Common:Migracion_Documentum">
            <attribute name="Autor">ppieroni</attribute>
            <attribute name="ID Documentum">E-0008749312</attribute>
        </category>
    </node>
    <node type="document" action="action">
        <location>Spain:Systems</location>
        <title>Factura pendiente</title>
        <file>D:\OPENTEXT\89443gs.xlsx</file>
        <category name="Content Server Categories:Non SAP Categories:Common:Migracion_Documentum">
            <attribute name="Autor">jcarballeira</attribute>
            <attribute name="ID Documentum">I-0001245366</attribute>
        </category>
    </node>
</import>

Когда я импортирую файл XML по этой схеме, Excel выкладывает данные следующим образом:

https://i.ibb.co/8xj55jM/XML-mapping.jpg

Похоже, что Excel не может сопоставить более одного атрибута, имеющего повторяющиеся элементы с разными тегами имен, так как мне приходится выбирать между отображением «Автор» или «ID Documentum».

Мне нужно было бы иметь возможность отображать большечем одна повторяющаяся строка с разными атрибутами и значениями в ней.

Как мне этого добиться?

С уважением

1 Ответ

0 голосов
/ 21 января 2019

Вы можете использовать синтаксический анализатор XML.

Обязательная ссылка через vbe> tools> ссылки на библиотеку Micorsoft XML (v.6 для меня)

Option Explicit
Public Sub test()
    Dim xmlDoc As Object

    Application.ScreenUpdating = False
    Set xmlDoc = CreateObject("MSXML2.DOMDocument")
    With xmlDoc
        .validateOnParse = True
        .setProperty "SelectionLanguage", "XPath"
        .async = False
        If Not .Load("C:\Users\HarrisQ\Desktop\test.xml") Then
            Err.Raise .parseError.ErrorCode, , .parseError.reason
        End If
    End With
    Dim node As IXMLDOMElement, childNode As IXMLDOMElement, nextChildNode As IXMLDOMElement, r As Long, c As Long, attrib As Object
    r = 1
    For Each node In xmlDoc.SelectNodes("//node")
        r = r + 1
        With ActiveSheet
            .Cells(r, 1) = node.getAttribute("type")
            .Cells(r, 2) = node.getAttribute("action") '<== you can hardcode create here as varies from value of attribute
            .Cells(r, 3) = node.SelectSingleNode("location").Text
            .Cells(r, 4) = node.SelectSingleNode("title").Text
            Set childNode = node.SelectSingleNode("category")
            .Cells(r, 5) = childNode.getAttribute("name")
            c = 6
            For Each nextChildNode In childNode.SelectNodes("attribute")
                .Cells(r, c) = nextChildNode.getAttribute("name")
                c = c + 1
            Next
        End With
    Next
    Application.ScreenUpdating = True
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...