Как импортировать данные XML с помощью Excel VBA?

Я пытаюсь импортировать данные из файла XML, как это:

<library>
<book>
<title>aaa</title>
<author>aaa-author</author>
</book>
<book>
<title>bbb</title>
<author>bbb-author</author>
</book>
<book>
<title>ccc</title>
</book>
</library>

(обратите внимание, что третья книга не имеет значения для автора)

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

Я работаю над кодом, как это:

Set mainWorkBook = ActiveWorkbook
Set oXMLFile = CreateObject("Microsoft.XMLDOM")
XMLFileName = "C:\example.xml"
oXMLFile.Load (XMLFileName)
Set Books = oXMLFile.SelectNodes("/book")
For i = 0 To (Books.Length - 1)
   ' I cannot understand this part
Next

1 ответ

Решение

Добавьте ссылку (Инструменты -> Ссылки...) в Microsoft XML 6.0. Это позволит вам иметь типизированные переменные (Dim book As IXMLDOMNode), который даст вам Intellisense.

Затем вы можете использовать следующий код, который перебирает все book элементы, сохраняет title а также author в двумерный массив (если они есть), затем вставляет массив в лист Excel:

Dim oXMLFile As New DOMDocument60
Dim books As IXMLDOMNodeList
Dim results() As String
Dim i As Integer, booksUBound As Integer
Dim book As IXMLDOMNode, title As IXMLDOMNode, author As IXMLDOMNode

'Load XML from the file
oXMLFile.Load "C:\example.xml"

'Get a list of book elements
Set books = oXMLFile.SelectNodes("/library/book")
booksUBound = books.Length - 1

'Create a two-dimensional array to hold the results
ReDim results(booksUBound, 1)

'Iterate through all the book elements, putting the title and author into the array, when available
For i = 0 To booksUBound
    Set book = books(i) 'A For Each loop would do this automatically, but we need the
                        'index to put the values in the right place in the array
    Set title = book.SelectSingleNode("title")
    If Not title Is Nothing Then results(i, 0) = title.Text
    Set author = book.SelectSingleNode("author")
    If Not author Is Nothing Then results(i, 1) = author.Text
Next

'Paste the results into the worksheet
Dim wks As Worksheet
Set wks = ActiveSheet
wks.Range(wks.Cells(1, 1), wks.Cells(books.Length, 2)) = results

Ссылки:

Рекомендации:

Другие вопросы по тегам