какой-нибудь инструмент с открытым исходным кодом или макрос Excel для извлечения списка xpath из XML? - PullRequest
0 голосов
/ 13 сентября 2011

В основном я хочу иметь возможность указать xml или 2, например, так (было бы здорово, если бы вы могли выбрать папку и она взяла бы все файлы xml оттуда):

Xml 1:

<Client>
              <LastName>Bill</LastName>
              <FirstName>Gates</FirstName>
              <MiddleName/>
              <Suffix/>
              <DateOfBirth>30-May-1968</DateOfBirth>
              <PlaceOfBirth/>
              <SSN>n/a</SSN>
              <Gender>Male</Gender>
              <District>
                <City>SHELTON</City>
                <Mayor>wong</Mayor>
              </District>
              <State>WA</State>
              <Zip>96484</Zip>
</Client>

Xml 2:

<Client>
              <LastName>Warron</LastName>
              <FirstName>Buffet</FirstName>
              <MiddleName>P</MiddleName>
              <Suffix/>
              <DateOfBirth>12-Aug-1957</DateOfBirth>
              <PlaceOfBirth>Mississippi</PlaceOfBirth>
              <SSN>n/a</SSN>
              <Gender>Male</Gender>
              <City>Missi</City>
              <State>KS</State>
              <Account>
                <Type>
                <Name>Cash</Name>
                <Currency>USD</Currency>
                <Country>USA</Country>
                </Type>
              </Account>
              <Zip>66096</Zip>
</Client>

Затем поместите список xpaths в столбец A таблицы Excel (т. Е. «Xpaths»), например:

/Client/DateOfBirth
/Client/Account/Type/Name
/Client/Zip
/Client/District/City

Желаемое поведение: получение результатов в виде таблицы нового листа Excel (т. Е. «Результаты») с такими столбцами, как:

/Client/DateOfBirth  /Client/Account/Type/Name   /Client/Zip   /Client/District/City

----------------     ------------------------    ------------   --------------------
30-May-1968                                      96484              SHELTON
12-Aug-1957           Cash                       66096

Не против, если это сделать с помощью макроса excel vba.

ОБНОВЛЕНИЕ - отладка ответа Тима: enter image description here

Ответы [ 3 ]

4 голосов
/ 17 сентября 2011

Это сработало для меня, используя ваши примеры (с добавлением XML DTD вверху) ...

Sub Tester()
    ProcessFiles ThisWorkbook.Path, Sheet1.Range("A1:D1")
End Sub

Sub ProcessFiles(FolderPath As String, XPathRange As Range)
    Dim oXML As MSXML2.DOMDocument
    Dim oNode As MSXML2.IXMLDOMNode
    Dim fName As String
    Dim c As Range
    Dim x As Integer
    Dim rv

    x = 1
    fName = Dir(FolderPath & "\*.xml")
    Do While fName <> ""
        Set oXML = New MSXML2.DOMDocument
        oXML.Load FolderPath & "\" & fName

        For Each c In XPathRange.Cells
            rv = ""
            Set oNode = oXML.SelectSingleNode(c.Value)
            If Not oNode Is Nothing Then
                rv = oNode.nodeTypedValue
            End If
            c.Offset(x, 0).Value = rv
        Next c

        x = x + 1
        fName = Dir()
    Loop

End Sub
2 голосов
/ 13 сентября 2011

Вы можете просто добавить карту XML в свою книгу и перетащить нужные элементы на свой лист:

  1. Откройте исходный файл Xml в Excel

  2. Выберите параметр «Использовать область задач« Источник XML »» и нажмите «ОК»

  3. Примите, что Excel создаст для вас схему

  4. Перетащите нужные элементы из исходной панели Xml в столбцы

  5. Щелкните правой кнопкой мыши по любому столбцу и выберите «Xml» -> «Import»

  6. Откройте нужный файл XML.

1 голос
/ 17 сентября 2011

Вы можете использовать это http://msdn.microsoft.com/en-us/library/ms675260(VS.85).aspx

Для перевода xml в столбец используйте

            If adoRS.Fields(ndx).Type = adChapter Then
                'you have a new column
                Set adoChildRS = adoRS.Fields(ndx).Value
                WalkHier iLevel, adoChildRS
            Else
                'put value in column
                Debug.Print iLevel & ": adoRS.Fields(" & ndx & _
                   ") = " & adoRS.Fields(ndx).Name & " = " & _
                   adoRS.Fields(ndx).Value
            End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...