【问题标题】:VBA DOM Find Specific Nodes With AttributesVBA DOM 查找具有属性的特定节点
【发布时间】: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


【解决方案1】:

你不需要增加任何东西。只需编写一个仅选择您感兴趣的节点的 XPath 查询:

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

【讨论】:

  • 谢谢哥们。我不得不对“冒险”使用单引号,而不会引发错误。感谢您的澄清。
  • 是否可以有多个属性条件? For Each n In XCMFILE.SelectNodes("/catalog/book[@id=""Adventure""]" &amp; @version="1.0")
  • 知道了(我想),For Each n In XCMFILE.SelectNodes("/catalog/book[@id=""Adventure"" and @version=""&amp; myVar &amp;""]")
猜你喜欢
  • 2015-06-12
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 2023-04-02
  • 2021-03-07
  • 1970-01-01
相关资源
最近更新 更多