요소의 n 번째 인스턴스를 가져 오기위한 XPath 쿼리


135

input동일한 고정 id속성을 가진 여러 요소 가있는 HTML 파일 (이 내용은 내가 제어하지 않음)이 있습니다 "search_query". 파일의 내용은 변경 될 수 있지만 항상 inputid 속성을 가진 두 번째 요소 를 얻고 싶다는 것을 알고 "search_query"있습니다.

이를 위해 XPath 표현식이 필요합니다. 시도 //input[@id="search_query"][2]했지만 작동하지 않습니다. 이 쿼리가 실패한 예제 XML 문자열은 다음과 같습니다.

<div>
  <form>
    <input id="search_query" />
   </form>
</div>

<div>
  <form>
    <input id="search_query" />
  </form>
</div>

<div>
  <form>
    <input id="search_query" />
  </form>
</div>

위의 예는 단지 예일 뿐이며 다른 HTML 코드는 상당히 다를 수 있으며 input요소는 일관된 문서 구조없이 어디에서나 나타날 수 있습니다 (단 input, id 속성 이 항상 두 개 이상인 요소 는 항상 보장된다는 점을 제외하고 ) "search_query").

올바른 XPath 표현식은 무엇입니까?


좋은 질문입니다, +1 문제에 대한 완전한 설명과 원하는 해결책에 대해서는 내 대답을 참조하십시오.
Dimitre Novatchev

7
사소한 점 : 주어진 ID를 가진 요소를 두 개 이상 가져서는 안됩니다 (따라서 질문의 HTML은 실제로 유효하지 않습니다). 실제로 브라우저는 어쨌든 할 수 있지만 ID를 사용하는 유일한 이점을 놓치면 "I 'm unique"라는 신호를 받는다는 것입니다 (클래스는 비 고유 한 기호).
machineghost

답변:


244

이것은 FAQ입니다 .

//somexpression[$N]

" //somexpression해당 노드에서 선택한 모든 노드를 찾으십시오 $N."

당신이 원하는 것은 :

(//input[@id="search_query"])[2]

알아두기 : []연산자는 //약어 보다 우선 순위가 높습니다 (우선 순위) .


6
나는이 답변을 좋아한다. 나는 우선 순위 문제를 고려하지 않았습니다 (단순한 왼쪽에서 오른쪽 우선 순위를 가정했습니다).
rlandster

10
@rlandster : "우선 순위"라는 단어가 혼동 될 수 있습니다. 약식 //input[@id='search_query'][2]은 다음과 같습니다./descendat-or-self::node()/child::input[attribute::id='search_query'][position()=2]

21
Google에서 여기 온 사람들의 경우 번호 매기기는 1-[1]부터 첫 번째 요소 등
Jan Mares

이 XPath 쿼리에서 이러한 종류의 배열은 1로 시작하여 혼란 스럽습니다.
Ivotje50

@ Ivotje50 예 XPath를 순서와 배열은 1을 기반으로
Dimitre Novatchev

21

이것은 작동하는 것 같습니다 :

/descendant::input[@id="search_query"][2]

Michael Kay의 "XSLT 2.0 및 XPath 2.0 프로그래머 참조 서, 4 판"에서이 작업을 수행합니다.

XML Path Language 사양 http://www.w3.org/TR/xpath/#path-abbrev 의 "Abbreviated Syntax"섹션에도 힌트가 있습니다.


이 답변에 감사드립니다. 필자의 경우 로봇 프레임 워크에서 xpath를 사용하면서 허용 된 솔루션이 작동하지 않으므로 대괄호로 시작하는 경로는 허용되지 않습니다. 그러나 이것은 속임수를
써야한다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.