【问题标题】:XPath to select Element by attribute valueXPath 按属性值选择元素
【发布时间】: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,不确定问题出在哪里。

【问题讨论】:

    标签: xml 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 文件 - 有问题。
      猜你喜欢
      • 1970-01-01
      • 2014-08-19
      • 2012-11-30
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      • 2011-03-18
      • 1970-01-01
      相关资源
      最近更新 更多