ChatGPT解决这个技术问题 Extra ChatGPT

XPath 按属性值选择元素

我有以下 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,不确定问题出在哪里。


J
JLRishe

您需要在 [ 之前删除 /。谓词([..] 中的部分)在它们之前不应该有斜线——它们直接在它们关联的节点选择器之后。

此外,要选择 Employee 元素本身,您应该去掉最后的 /text()。否则,您只需选择 Employee 元素下的空白文本值。

//Employee[@id = '4']

还有一点需要注意:// 可能会非常慢,因为它会在整个文档中搜索匹配的节点。如果您正在使用的文档的结构是一致的,那么您最好使用更明确的路径,例如:

/Employees/Employee[@id = '4']

请注意,// 选择并搜索文档的 所有 个节点,这可能会很慢。相反,如果文档的结构已知,则使用正确的路径,如下面的 Gilles' answer 中建议的那样。
@Jens 是的,这绝对是真的。我已经编辑了答案以添加附录。
d
de-russification

接下来,您可以像这样选择“具有特定属性的所有节点”:

//*[@id='4']

G
Gilles Quenot

尝试这样做:

/Employees/Employee[@id=4]/*/text()

xmllint 在查找 id 之前是否将整个 xml 文件加载到内存中?我有一个 46 GB 的 xml 文件,我正在寻找其中的 id
46 GB 的 xml 文件 - 有问题。