2015-03-16 7 views
2

У меня есть большой XML-файл, который я пытаюсь проанализировать с помощью DOM. То, что я пытаюсь сделать, это только вытащить информацию из узла, если у родителя есть определенный атрибут «id».VBA DOM Найти конкретные узлы с атрибутами

Например, если я хочу вытащить TITLE или AUTHOR для книг, содержащих «id = Adventure» - как бы я это сделал, используя DOM?

<?xml version="1.0"?> 
<catalog> 
<book id="Adventure"> 
    <author>Gambardella, Matthew</author> 
    <title>XML Developer's Guide</title> 
    <price>44.95</price> 
</book> 
<book id="Adventure"> 
    <author>Ralls, Kim</author> 
    <title>Midnight Rain</title> 
    <price>5.95</price> 
</book> 
<book id="Adventure"> 
    <author>Boal, John</author> 
    <title>Mist</title> 
    <price>15.95</price> 
</book> 
<book id="Mystery"> 
    <author>Ralls, Kim</author> 
    <title>Some Mystery Book</title> 
    <price>9.95</price> 
</book> 
</catalog> 

Теперь, используя этот код:

Sub mySub() 

Dim mainWorkBook As Workbook 
Dim XCMFILE As Variant 
Dim BookType As String 
Dim BookTitle As Variant 
Dim Title As String 
Dim n As IXMLDOMNode 
Dim i As Integer 

Set mainWorkBook = ActiveWorkbook 
Set XCMFILE = CreateObject("Microsoft.XMLDOM") 

XCMFILE.Load (XCMFileName) 'Load XCM File 


i = 0 

For Each n In XCMFILE.SelectNodes("/catalog/book") 
    BookType= n.Attributes.getNamedItem("id").Text 'Search for id attribute within node 
    If BookID = "Adventure" Then 
     Set BookTitle = = XCMFILE.SelectNodes("/catalog/book/title/text()") 
     Title = BookTitle(i).NodeValue 
     mainWorkBook.Sheets("Sheet1").Range("B" & i + 3).Value = BookTitle'Prints values into B column 
     i = i + 1 
    EndIf 

Next 
End Sub 

Я не знаю, как правильно увеличивать только тянуть узлы, которые соответствуют моей спецификации/категорию.

Спасибо за любые советы и указатели - я ценю это.

+0

XPath в 'XCMFILE.SelectNodes («/ каталог/книги»)' должны быть в состоянии выбрать только 'ID = Adventure' узлы, поэтому они были бы единственными узлами, которые вам нужны для повторения. –

+0

Я не совсем уверен, что вы подразумеваете под XPath. Вы говорите, что, поскольку Adventure - это первый тип, который появляется, это будет только для этого? – NRH

+1

Строка, которую вы там положили, называется XPath; есть способ заставить его возвращать только те узлы, которые вас интересуют, искать «узлы выбора xpath с определенным значением атрибута»;) –

ответ

1

Вам ничего не нужно увеличивать. Просто написать запрос XPath, который выбирает только те узлы, которые вы заинтересованы в:

For Each n In XCMFILE.SelectNodes("/catalog/book[@id=""Adventure""]") 
    ' n is a book node with the "id" attribute value "Adventure" 
Next 
+0

Спасибо, приятель. Мне пришлось использовать одинарные кавычки для «Приключения» без ошибки. Оцените пояснение. – NRH

+0

Возможно ли иметь несколько атрибутов con виях? 'Для каждого n в XCMFILE.SelectNodes ("/catalog/book [@id = "" Adventure ""] "& @ version =" 1.0 ")' – NRH

+0

Получил (я думаю), 'Для каждого n В XCMFILE.SelectNodes ("/ catalog/book [@id =" "Приключения" и @version = "" & myVar & ""] ")' – NRH

Смежные вопросы