XPath : 텍스트 노드 선택


150

다음과 같은 XML이 있습니다.

<node>Text1<subnode/>text2</node>

XPath를 통해 첫 번째 또는 두 번째 텍스트 노드를 어떻게 선택합니까?

이 같은:

/node/text()[2]

물론 노드 안의 모든 텍스트의 병합 결과이기 때문에 작동하지 않습니다.


11
당신이 썼다 /node/text()[2]는 노드 내부의 모든 텍스트의 병합 된 결과이기 때문에 [...]이 작동하지 않습니다 의 잘못 그 : 그것은 의미 의 두 번째 텍스트 노드 자식 node루트 요소를 . 문자열 값 (하위 텍스트 노드의 연결은) 것string(/node)

Xpath 쿼리가 작동해야 함을 의미합니까? 글쎄, 그때 다른 곳에 다른 문제가 있다고 생각합니다. ;) 감사!
커널

좋은 질문입니다, +1 설명과 상단 요소의 전체 또는 특정 텍스트 노드 자식을 선택하는 여러 XPath 표현식에 대한 대답을 참조하십시오.
Dimitre Novatchev 5

답변:


183

다음과 같은 XML이 있습니다.

<node>Text1<subnode/>text2</node> 

XPath를 통해 첫 번째 또는 두 번째 텍스트 노드를 어떻게 선택합니까?

사용 :

/node/text()

XML 문서의 최상위 요소 ( "노드")의 모든 텍스트 노드 자식을 선택합니다.

/node/text()[1]

XML 문서의 최상위 요소 (이름이 "노드")의 첫 번째 텍스트 노드 자식을 선택합니다.

/node/text()[2]

XML 문서의 최상위 요소 ( "노드")의 두 번째 텍스트 노드 자식을 선택합니다.

/node/text()[someInteger]

XML 문서의 최상위 요소 (이름이 "노드")의 일부 정수 텍스트 노드 자식을 선택합니다. 다음 XPath 표현식과 동일합니다.

/node/text()[position() = someInteger]

@NaftuliTzviKay : Chrome이 고장 났음을 의미합니다. /node[2]소스 XML 문서가 올바른 경우 노드를 선택하지 않아야합니다. 또한로 알려진 - 잘 구성된 XML 문서의 정의에 단 하나의 (단일) 맨 위에있는 요소가document-element
Dimitre Novatchev

1
이것은 PHP에서 작동합니까? 텍스트 노드, 태그 세트 사이의 텍스트 노드 만 반복하려고합니다. 문제는 태그에 관계없이 여러 텍스트 노드의 내용을 함께 스매싱한다는 것입니다. //*[text()]어쨌든 사용 합니다. /html/text()작동하지 않습니다.
Aaron Gillion 2016 년

2
@AaronGillion, 예. AFAIK PHP에는 올바르게 작동하는 XPath 1.0 평가가 있습니다. 참고 수행 /html/text()상단의 아이들 (하지 후손) 만 텍스트 노드 - 문서의 모든 텍스트 노드를 선택하지 않는 html요소를. 당신은 아마 원할 것입니다 /html//text() . XPath 표현식을 구성하려면 일반적으로 XPath에 대한 지식과 이해가 필요합니다.
Dimitre Novatchev 2016 년

감사. 조금 전에 더블 슬래시 트릭을 알아 냈습니다!
Aaron Gillion 2016 년

@AaronGillion, 천만에요. 이 온라인 교육 과정의 모듈 2에서 XPath 1.0 및 2.0의 기본 사항을 배울 수 있습니다. pluralsight.com/courses/xslt-foundations-part1
Dimitre Novatchev

29

xpath가 작동해야합니다. MarkLogic과 Zorba Xquery / Xpath 구현 모두에서 xpath와 광산을 테스트했습니다.

둘 다 작동합니다.

/node/child::text()[1] - should return Text1
/node/child::text()[2] - should return text2


/node/text()[1] - should return Text1
/node/text()[2] - should return text2
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.