2016-06-26 3 views
-1

방금 ​​XPath를 선택하고 쿼리 작업을 시도했지만 어떻게 든 원하는 요소를 선택하지 않습니다.루트 요소의 직접 하위에서만 텍스트를 검색하는 XPath 쿼리 문자열?

XML 샘플 :

<?xml version="1.0" encoding="UTF-8"?> 
<d:data xmlns:d="defiant-namespace" d:constr="Array" d:mi="8"> 
    <d:item d:mi="2"> 
    <name d:constr="String" d:mi="1">Asian Winged Bean</name> 
    </d:item> 
    <d:item d:mi="7"> 
    <image d:mi="5"> 
     <name d:constr="String" d:mi="3">wbss-1a20ed37-e498-47ad-b97d-c36c4d653b66-mps4YI4gNB</name> 
     <url d:constr="String" d:mi="4">http://dropbox.com/7f3f1192-191e-41a6-8bcd-47ab1d30af3b/wbss-1a20ed37-e498-47ad-b97d-c36c4d653b66-mps4YI4gNB</url> 
    </image> 
    <name d:constr="String" d:mi="6">Akha Striped Bean</name> 
    </d:item> 
</d:data> 

내 쿼리는 첫 <item>을 집어

//*[contains(name,"w")] 

이지만, 그것은 또한 내가 그것을 싶지 않아 <image> 요소를 선택합니다. 자녀가 아닌 최상위 요소에서만 텍스트를 검색 할 수있는 방법이 있습니까? 이

+0

나는이 쿼리 // * [포함 (이름 [1], "w")] – nirvana74v

+1

그게 해결되면, 문제를 사용하여 나 자신 해결 당신이 요구하는 것이 아닙니다. "최상위 요소가 아닌 자식 요소"를 지정했지만, // // [contains (name [1], "w")]'는 그러한 제한을 적용하지 않습니다. –

+0

안녕하세요 찰스, 내가 말했듯이, XPath에 익숙하지 않고 XPath의 용어에 따라 문구가 아닙니다. 필자는 샘플과 결과를 제공했습니다. 이것이 Q의 질문을하는 동안 많은 사람들이이 한계를 이해하는 데 도움이되기를 바랍니다. 감사합니다 :) – nirvana74v

답변

2

당신은이 대답은 기술적으로는 정확하지만 지금은 유용하지 않습니다. 그것을 유용을하기 위해서는 가깝다 다음과 방식으로 변경됩니다 :

/*/*//* 교체
/*/*[contains(name,"W")] 

우리는 (문서의 루트를지나 한 단계를 통과하는 것을하고 있다는 의미 "정규되는 최상위 레벨 "). 그런데


- 당신이 당신의 유형을 알고 있다면, 당신은 /*을 피하는 것이 좋습니다; 이 구조를 사용하면 요소 유형의 색인이 사용되지 않으므로 색인 된 문서에 대해 작동 할 때 일부 일반적인 엔진 최적화가 쿼리 속도를 높이는데 사용되지 않습니다.

XPath 엔진에 대한 네임 스페이스 맵으로 {d: "defiant-namespace"}에 해당하는 일부 로컬 언어를 전달한다고 가정하면 (프로그래밍 언어, XPath 라이브러리 &c를 모른 채로 할 수있는 방법은 알 수 없습니다) 성능 관점에서 다음에 더 잘 :

/d:data/d:item[contains(name, "W")] 
1

변경 :

//*[contains(name,"w")] 

/*[contains(name,"w")] 

에가 "//"재귀 XML 트리를 검색 는 "/"은 루트 노드에서 보이는

+0

테스트를했는지 모르겠지만 일치 항목이 – nirvana74v

+1

@ nirvana74v라고 말하면 원하는 * 주장 *을 성공적으로 구현합니다. 최상위 요소 만 검색합니다 왜냐하면 본질적으로 XML 문서는 최상위 요소를 하나만 가질 수 있기 때문입니다. 귀하의 'item'중 최상위 요소는 없습니다. 샘플의 'data' 요소 만 최상위 요소입니다. –

관련 문제