2013-01-09 2 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

[ 전에 /을 제거해야합니다. 술어 ([]의 파트)는 그 직전에 슬래시가 있어서는 안됩니다. 또한 Employee 요소 자체를 선택하려면 끝에 /text()을 남겨 두어야합니다. 그렇지 않으면 Employee 요소 바로 아래의 공백 텍스트 값을 선택하기 만하면됩니다.

//Employee[@id='4'] 

편집 : 옌스는 의견에서 지적 하듯이 대응하는 노드를위한 전체 문서를 검색하기 때문에, //가 매우 느릴 수 있습니다. 당신이 일관 될 것입니다 작업중인 문서의 구조 경우, 예를 들어, 아마 전체 경로를 개시 최고 :

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

주'그 //'느려질 수있는 문서의 모든 * 노드를 선택하여 검색합니다. 대신 문서 구조가 알려진 경우 [Gilles 'answer] (http://stackoverflow.com/questions/14248063/xpath-to-select-element-by-attribute-value)에서 제안 된 것과 같은 적절한 경로를 사용하십시오. # 14248129). – Jens

+0

@Jens 예, 그건 사실입니다. 나는 내 대답을 편집하여 부록을 추가했다. – JLRishe

8

이 일을보십시오 :

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

xmlllint는 ids를 찾기 전에 전체 xml 파일을 메모리에로드합니다. 나는 46 GB의 XML 파일을 가지고 있고 그 안에 ID를 찾고있다. –

관련 문제