2013-01-09 86 views
143

我有以下XML。XPath按属性值选择元素

<?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,不知道在哪里的问题。

回答

215

您需要在[之前删除/。谓词([]中的部分)在它们之前不应该有斜杠。此外,要选择员工元素本身,您最后应该离开/text(),否则您只需在Employee元素下面立即选择空白文本值。

//Employee[@id='4'] 

编辑:正如延斯在评论中指出,//可能会很慢,因为它会搜索匹配节点整个文档。如果你正在使用将是一致的工作文档的结构,你可能是最好关闭使用完整路径,例如:

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

注意' //选择并搜索可能较慢的文档中的所有*节点。相反,如果文档的结构已知,则使用正确的路径,如[Gilles的答案]中所述(http://stackoverflow.com/questions/14248063/xpath-to-select-element-by-attribute-value #14248129)。 – Jens

+0

@Jens是的,这是绝对正确的。我编辑了我的答案以添加附录。 – JLRishe

8

试着这样做:

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

xmllint在查找ID之前是否将整个xml文件加载到内存中?我有一个46 GB的XML文件,我正在寻找它的IDS –