Как импортировать данные 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
Ссылки:
- Руководство для начинающих по XML DOM
- Запрос XML-файлов с использованием VBScript
- Progarm DOM с Visual Basic - содержит ряд хороших прохождений
Рекомендации:
- XML DOM - концепции, ссылки
- VBA - Тусклое заявление
- Excel - свойство Range, свойство Cells