【发布时间】:2015-05-18 20:16:05
【问题描述】:
我有一个大型 XML 文件,我正在尝试使用 DOM 进行解析。我要做的只是从一个节点中提取信息,如果它的父节点包含一个特定的“id”属性。
例如,如果我只想提取包含“id = Adventure”的书籍的 TITLE 或 AUTHOR - 我将如何使用 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
我不知道如何正确递增以仅拉取符合我的规范/类别的节点。
感谢您的任何提示和指点 - 我很感激。
【问题讨论】:
-
XCMFILE.SelectNodes("/catalog/book")中的 XPath 应该只能选择id=Adventure节点,因此它们将是您需要迭代的唯一节点 -
我不太清楚您所说的 XPath 是什么意思。你是说既然Adventure是第一个出现的类型,就只会出现这种情况吗?
-
您放在那里的字符串称为 XPath;有一种方法可以让它只返回您感兴趣的节点,查找“xpath 选择具有特定属性值的节点”;)
-
非常感谢马特。一个简单的问题,我不断收到错误“编译错误:预期:列表分隔符或)”知道这意味着什么吗?我的代码行是 BookTitle.SelectNodes("/catalog/book[@id="bk102"/author/text()")... 错误实际上突出显示了 "bk102"
-
您需要一组引号来告诉 VBA “嘿,看,这是一个文字字符串”,然后由于该字符串文字需要包含引号,因此您需要为每个引号添加 2,以便 VBA 获胜不要想“哦,嘿,所以你的字符串字面量到这里就结束了吗?”当它发现下一个字符也是双引号时,它就会繁荣起来;)所以
"""hello, world"""输出"hello, world"
标签: xml vba dom xml-parsing attributes