用于获取子属性值的XPath表达式

时间:2015-09-23 13:17:53

标签: xml xpath

我试图从示例XML文件中获取子属性的值:

<book id="123">
<title>Game of Thrones</title>
<season>5</season>
</book>

我的XPath表达式为/book,但有了这个,我只能获得id的值。

如果我的XML是这样的:

<book> 
   <id>123</id>
   <title>Game of Thrones</title>
   <season>5</season>
</book>

...如果我将表达式设为/book,我没有得到任何值。

预期结果:

123
Game of Thrones
5

3 个答案:

答案 0 :(得分:0)

给出像这样的Xml

<books>
  <book>
    <id>123</id>
    <title>Game of Thrones</title>
    <season>5</season>
  </book>
  <book>
    <id>124</id>
    <title>Harry Potter</title>
    <season>5</season>
  </book>
</books>

此Xpath将检索给定id

的元素
  

/书籍/书[ID = 124]

答案 1 :(得分:0)

如果您的XML文档确实如此

<book> 
   <id>123</id>
   <title>Game of Thrones</title>
   <season>5</season>
</book>

你确实希望成为

123
Game of Thrones
5

然后,您正在查找输入文档中的文本节点。选择文档中所有文本节点的XPath表达式是

//text()

这也将选择仅包含空格的文本节点,因此结果可能如下(单个结果由-------分隔):

-----------------------
123
-----------------------
-----------------------
Game of Thrones
-----------------------
-----------------------
5
-----------------------

正如您所看到的,结果中只有空白行,但确切的行为取决于您的XPath引擎以及如何显示结果。

如果应排除仅限换行符,请使用谓词:

//text()[normalize-space()]

解释了这种技术here。基本上,如果在规范化空格后留下文本内容,谓词将返回True。

答案 2 :(得分:0)

对于在您的问题中指定为第二个示例的xml,您可以使用此XPath表达式获取所有子元素值:

/book[id=123]/child::*/text()

实际上,/book[id=123]选择ID为123的<book>元素,child::*获取其子代,text()从子代获取文字。