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 按属性值选择元素的主要内容,如果未能解决你的问题,请参考以下文章

Xpath - 选择具有属性的元素并获取另一个属性值

css 或 xpath 选择器:具有特定值的任何属性的元素

具有特定值的任何属性的所有元素的 XPath?

xpath按元素和属性查找节点,其中包含具有特定id的子元素

按属性查找元素

匹配 TR 元素的 bgcolor 属性的 XPath 表达式