XPath를 사용하여 특정 속성을 가진 첫 번째 요소를 선택하는 방법


300

XPath가 bookstore/book[1]에서 첫 번째 책 노드를 선택합니다 bookstore.

더 복잡한 조건과 일치하는 첫 번째 노드를 선택하는 방법 (예 : 일치하는 첫 번째 노드) /bookstore/book[@location='US']

답변:


444

사용하다:

(/bookstore/book[@location='US'])[1]

먼저 location 속성이 'US'인 책 요소를 가져옵니다. 그런 다음 해당 세트에서 첫 번째 노드를 선택합니다. 일부 구현에 필요한 괄호 사용에 유의하십시오.

/bookstore/book[1][@location='US']첫 번째 요소에 해당 위치 속성 이없는 경우와 동일하지 않습니다 .


// bookstore / book [@ location = 'US']에 대해 어떻게 동일합니까?
Alexander V. Ilyin

7
'미국'에서 모든 책을 가져옵니다. (/ bookstore / book [@ location = 'US']) [1]은 첫 번째 항목을 가져옵니다.
Kevin Driedger

3
@KevinDriedger /bookstore/book[@location='US'][1]가 '미국'의 모든 책을 반환하지는 않습니다. 나는 그것을 여러 번 그리고 다른 언어의 xpath 구현에서 테스트했다. /bookstore/book[@location='US'][1]서점에서 첫 번째 '미국'책을 반환합니다. 여러 서점이있는 경우 각 서점에서 첫 서점을 반환합니다. 이것이 OP가 요청한 것입니다 (서점의 첫 번째 노드). 버전은 모든 서점에서 첫 번째 책만 반환합니다 (첫 번째 일치).
Jonathan Fingland

3
@JonathanFingland 당신이 오해했습니다-AlexanderV.Ilyin의 질문의 맥락과 함께 KevinDriedger의 답변을 다시 읽으십시오. 둘 다 같은 것을 의미합니다.
kiedysktos

175

/bookstore/book[@location='US'][1] 간단한 구조에서만 작동합니다.

좀 더 구조를 추가하면 문제가 해결됩니다.

<bookstore>
 <category>
  <book location="US">A1</book>
  <book location="FIN">A2</book>
 </category>
 <category>
  <book location="FIN">B1</book>
  <book location="US">B2</book>
 </category>
</bookstore> 

/bookstore/category/book[@location='US'][1] 수확량

<book location="US">A1</book>
<book location="US">B2</book>

"더 복잡한 조건과 일치하는 첫 번째 노드"가 아닙니다. /bookstore/category/book[@location='US'][2]아무것도 반환하지 않습니다.

괄호를 사용하면 원래 질문의 결과를 얻을 수 있습니다.

(/bookstore/category/book[@location='US'])[1] 준다

<book location="US">A1</book>

그리고 (/bookstore/category/book[@location='US'])[2]작품으로 기대했다.


11
허용 된 답변의 작성자는 여기입니다. OP의 질문은 고려 /bookstore/book[1]되었고 NOT (/bookstore/book)[1]. 제공하신 사례는 OP가 요청한 사례와 다릅니다. 아마도 OP는 예상 ​​한대로 요청한대로 응답을 받아 들였습니다.
Jonathan Fingland

이 답변은이 특별한 경우에 도움이되었습니다. 누군가 "더 복잡한 상황"을 처리하지 않는 이유를 설명 할 수 있습니까? 기본적으로 두 항목으로 구성된 목록을 찾을 수 있기 때문에 [2] 그냥
가져와야

필자의 경우와 같이이 답변이 선택한 답변보다 더 정확한 것으로 나타났습니다. [1]을 추가하면 여러 노드가 반환되는 더 복잡한 구조도 있습니다. 감사!
mydoghasworms

2
괄호 작업! 다음과 같이 (..) [1] 뒤에 더 많은 경로를 추가 할 수도 있습니다 '(//div[text() = "'+ name +'"])[1]/following-sibling::*/div/text()'. 일치하는 노드가 많은 경우 name.
Hlung

1
내 의견을 바꾸고 있습니다. 약간의 거리 후에, 나는이 답변이 말한 것을 얻었고, OP의 예를 보지 못했다면 나는 이것에 투표했다. 나는이 대답의 어조에 반응하고 있다고 생각한다. @tkurki가 첫 번째 노드의 선택에서 조건을 분리하는 방법에 대해 조금 더 설명했다면 즉시 보았습니다. JonFingland도 마찬가지입니다.
제라드 ONeill

51

Jonathan Fingland의 답변에 대한 설명 :

  • 동일한 조건 자 ( [position()=1 and @location='US']) 의 여러 조건 이 전체적으로 사실이어야합니다.
  • 연속적인 술어에 여러 조건 ( [position()=1][@location='US']) 참이어야 속출
  • 이것은 [position()=1][@location='US']! = [@location='US'][position()=1]
    동안 [position()=1 and @location='US']==[@location='US' and position()=1]
  • 힌트 : 고독 [position()=1]은 다음과 같이 축약 될 수 있습니다[1]

당신은 부울 연산자 "와 술어 복잡한 표현을 구축 할 수 있습니다 and"와 " or"및 부울 XPath 함수와 not(), true()false(). 또한 하위 표현식을 괄호로 묶을 수 있습니다.


15

보다 복잡한 구조화 된 xml 파일을 고려하여 첫 번째 영어 서적 노드를 찾는 가장 쉬운 방법은 다음과 같습니다.

<bookstore>
 <category>
  <book location="US">A1</book>
  <book location="FIN">A2</book>
 </category>
 <category>
  <book location="FIN">B1</book>
  <book location="US">B2</book>
 </category>
</bookstore> 

xpath 표현식입니다.

/descendant::book[@location='US'][1]


10
    <bookstore>
     <book location="US">A1</book>
     <category>
      <book location="US">B1</book>
      <book location="FIN">B2</book>
     </category>
     <section>
      <book location="FIN">C1</book>
      <book location="US">C2</book>
     </section>
    </bookstore> 

위의 내용을 감안할 때; 당신은 첫 번째 책을 선택할 수 있습니다

(//book[@location='US'])[1]

그리고 이것은 위치가 미국인 첫 번째 곳을 찾을 것입니다. [A1]

//book[@location='US']

위치가 US 인 모든 책으로 설정된 노드를 반환합니다. [A1, B1, C2]

(//category/book[@location='US'])[1]

문서의 어느 위치 에나있는 첫 번째 책 위치 US를 반환합니다. [B1]

(/bookstore//book[@location='US'])[1]

루트 요소 서점 아래에 위치 US가있는 첫 번째 책을 반환합니다. / bookstore 부분을 실제로 중복으로 만듭니다. [A1]

직접적인 대답으로 :

/bookstore/book[@location='US'][1]

서점 아래에 위치 US가있는 책 요소의 첫 번째 노드를 반환합니다. [A1]

이 예제에서 서점의 직계 자녀가 아닌 최초의 미국 서적을 찾으려면 다음과 같이하십시오.

(/bookstore/*//book[@location='US'])[1]

4

xpath가 복잡하거나 동일한 xpath가있는 둘 이상의 노드가있는 경우 색인을 사용하여 원하는 노드를 얻으십시오.

예 :

(//bookstore[@location = 'US'])[index]

원하는 노드 수를 지정할 수 있습니다.


2

주어진 XML에 네임 스페이스가 제공되면 이것을 사용하는 것이 좋습니다.

(/*[local-name() ='bookstore']/*[local-name()='book'][@location='US'])[1]


-1

온라인의 도움으로 테스터 XPath는 내가 ...이 대답을 쓰고 있어요
이를 위해 :

<table id="t2"><tbody>
<tr><td>123</td><td>other</td></tr>
<tr><td>foo</td><td>columns</td></tr>
<tr><td>bar</td><td>are</td></tr>
<tr><td>xyz</td><td>ignored</td></tr>
</tbody></table>

다음 xpath :

id("t2") / tbody / tr / td[1]

출력 :

123
foo
bar
xyz

이후 1 개 수단 모두 선택 TD를 자신의 직접 부모의 첫 번째 자식있는 요소.
그러나 다음 xpath :

(id("t2") / tbody / tr / td)[1]

출력 :

123
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.