根据兄弟节点的值选择XML节点

时间:2015-03-19 15:15:10

标签: xml vb.net xpath

我有一个VB.NET 2013程序,它读取/写入xml文档,当我知道其中一个节点的兄弟节点的文本时,我正试图弄清楚如何访问特定节点。我已经看到其他帖子类似到我正在尝试做的事情,但我的xml结构略有不同,我不知道如何将这些解决方案应用到我的文档中。

以下是我的xml结构示例:

<?xml version="1.0" encoding="utf-8"?>
<Books>
  <Book>
    <Title>Hansel and Gretel</Title>
    <Pages>221</Pages>
    <Price>3.5</Price>
    <Author>Grimm</Author>
  </Book>
  <Book>
    <Title>Green Eggs and Ham</Title>
    <Pages>145</Pages>
    <Price>5.25</Price>
    <Author>Dr. Seuss</Author>
  </Book>
</Books>

我在其他帖子中看到的示例中包含节点名称<Title title="Green Eggs and Ham">中的值。如你所见,我的不是。

我无法弄清楚如何在我的xml文档中使用XPath,XPathNavigator等来查找价格,例如,如果我知道标题。

我看到很多示例如下:/Books/Book[@Title="Green Eggs and Ham"],我尝试将其与XPathNavigator.SelectSingleNode()一起使用,但我无法弄清楚要用于我的正确VB.Net/XPath语法xml格式。

更新(示例答案) 由于我在VB.NET项目中使用它,我需要知道如何使用Bogdan和ThW给出的示例。使用我的示例XML我这样做是为了获得标题“Hansel and Gretel”的页数:

Dim xpathDoc As XPathDocument = New XPathDocument([path_to_xml)
Dim xmlNav as XPathNavigator = xpathDoc.CreateNavigator()
Dim pages as String

pages = xmlNav.SelectSingleNode("/Books/Book[Title='Hansel and Gretel']/Pages").Value

当然,返回“221”

2 个答案:

答案 0 :(得分:6)

XPath中的@attribute::的快捷方式。它选择属性节点(或属性轴上的更多特定节点)。

您的Title节点是一个元素节点。它是Book元素节点的子节点。 child是默认轴,因此它是可选的。基本上/Books/Book/child::Books/child::Book的缩写。

[]中的部分是节点的条件。 [@Title="Green Eggs and Ham"]使用给定值过滤属性Title的节点。

要查找子元素节点Title,请删除@

/Books/Book[Title="Green Eggs and Ham"]

答案 1 :(得分:0)

//Book/Title[text()='Green Eggs and Ham']/../Price

text()搜索价值。 ..选择父元素

修改

感谢您对.的解释,已从答案中移除。