2012-12-27 1 views
3

짧은 질문 만하기 때문에 전체 코드를 게시하는 것은 쉽지 않습니다. XPath를 사용하여 XML 문서에서 텍스트 값을 검색하고 있습니다. 난 그냥 노래 - 제목과 첫 번째를 원특정 노드 (XPath 및 iTunes XML) 다음에 첫 번째로 일치하는 요소를 검색합니다.

//string[preceding-sibling::key[text()[contains(., 'Name')]]]/text() 

하지만이 모든 다음 문자열 태그 나 제공 : 나는이 같은 표현이

<key>Name</key> 
<string>Dat Ass</string> 
<key>Artist</key> 
<string>Earl Sweatshirt</string> 
<key>Album</key> 
<string>Kitchen Cutlery</string> 
<key>Kind</key> 
<string>MPEG-Audiodatei</string> 

와 마찬가지로 XML이있다.

알렉스

답변

1

사용는 :

(//key[. = 'Name'])[1]/following-sibling::string[1]/text() 

주의 마십시오 :

(//string[preceding-sibling::key[1] = 'Name'])[1]/text() 

또한, 하나는 앞으로 만 표현을 사용할 수 있습니다

이것은 일반적인 오류입니다. 종류의 어떤 표현 :

//someExpr[1] 

는 "//someExpr에 의해 선택된 모든 노드에서 문서의 첫 번째 노드"를 선택하지 않습니다. 실제로 그것은 많은 노드를 선택할 수 있습니다.

위의 표현식은 //someExpr에 의해 선택되고 그 부모 중 첫 번째 해당 노드를 선택합니다.

이 때문에 대괄호없이이 질문에 대한 다른 대답이 일반적으로 잘못되었습니다.

0

당신은 단지 첫 번째 일치 노드를 선택하는 또 다른 조건 [1]를 추가 할 수 있습니다 접견. text()를 사용하여 중첩 술어는 불필요한해야한다 :

//string[preceding-sibling::key[contains(., 'Name')]][1]/text() 

또 다른, 어쩌면 더 효율적으로,이 노드를 선택하는 방법은

//key[contains(., 'Name')]/following-sibling::*[1][self::string] 

이 (어떤 이름으로) 첫 번째 노드를 선택하는 것이 다음 key 원 노드 이름이 string인지 테스트하십시오.