XPath 按属性值选择元素
Posted
技术标签:
【中文标题】XPath 按属性值选择元素【英文标题】:XPath to select Element by attribute value 【发布时间】:2012-12-24 06:12:09 【问题描述】:我有以下 XML。
<?xml version="1.0" encoding="UTF-8"?>
<Employees>
<Employee id="3">
<age>40</age>
<name>Tom</name>
<gender>Male</gender>
<role>Manager</role>
</Employee>
<Employee id="4">
<age>25</age>
<name>Meghna</name>
<gender>Female</gender>
<role>Manager</role>
</Employee>
</Employees>
我想选择 id="4" 的 Employee 元素。
我正在使用下面的 XPath 表达式,它没有返回任何内容。
//Employee/[@id='4']/text()
我在http://chris.photobooks.com/xml/default.htm 查过,它说无效的 xpath,不确定问题出在哪里。
【问题讨论】:
【参考方案1】:您需要在[
之前删除/
。谓词([
]
中的部分)前面不应有斜杠。此外,要选择 Employee 元素本身,您应该在末尾去掉 /text()
,否则您只需选择 Employee 元素正下方的空白文本值。
//Employee[@id='4']
编辑: 正如 Jens 在 cmets 中指出的那样,//
可能会非常慢,因为它会搜索整个文档以查找匹配节点。如果您正在使用的文档的结构要保持一致,您可能最好使用完整路径,例如:
/Employees/Employee[@id='4']
【讨论】:
请注意,//
会选择并搜索文档的 所有 节点,这可能会很慢。相反,如果文档的结构已知,则使用正确的路径,如下面的Gilles' answer 建议的那样。
@Jens 是的,这绝对是真的。我已经编辑了答案以添加附录。【参考方案2】:
接下来,您可以像这样选择“具有特定属性的所有节点”:
//*[@id='4']
【讨论】:
【参考方案3】:尝试这样做:
/Employees/Employee[@id=4]/*/text()
【讨论】:
xmllint 是否在查找 id 之前将整个 xml 文件加载到内存中?我有一个 46 GB 的 xml 文件,我正在寻找其中的 id 46 GB 的 xml 文件 - 有问题。以上是关于XPath 按属性值选择元素的主要内容,如果未能解决你的问题,请参考以下文章