속성 값으로 요소를 선택하는 XPath


195

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가 표시됩니다.

답변:


278

를 제거 /해야합니다 [. 술어 (의 부분 [ ])는 바로 앞에 슬래시가 없어야합니다. 또한 Employee 요소 자체를 선택하려면 /text()마지막 부분을 그대로 두거나 그렇지 않으면 Employee 요소 바로 아래에 공백 텍스트 값을 선택해야합니다.

//Employee[@id='4']

편집 : Jens가 주석에서 지적한 것처럼 //전체 문서에서 일치하는 노드를 검색하기 때문에 속도가 매우 느릴 수 있습니다. 작업중인 문서의 구조가 일관된 경우 전체 경로를 사용하는 것이 가장 좋습니다. 예를 들면 다음과 같습니다.

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

3
느릴 수있는 문서의 모든 노드 를 //선택하고 검색 합니다. 대신, 문서의 구조가 알려진 경우 아래 Gilles의 답변 에서 제안한 것처럼 적절한 경로를 사용하십시오 .
Jens

@Jens 예, 그것은 사실입니다. 부록을 추가하기 위해 답변을 편집했습니다.
JLRishe

13

다음으로 "특정 속성을 가진 모든 노드"를 다음과 같이 선택할 수 있습니다.

//*[@id='4']

12

이것을 시도하십시오 :

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

xmllint는 id를 찾기 전에 전체 xml 파일을 메모리에로드합니까? 나는 46GB의 xml 파일을 가지고 있고 그것에 id를 찾고있다
Hani Goc

46GB의 xml 파일 -문제가 있습니다.
Gurwinder Singh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.