2011-02-10 2 views
6

내가 본 주변의 네임 스페이스 불가지론 구문은 나를 혼란스럽게합니다. 네임 스페이스 불가지론 요소 컨텐트가 포함 된 XPath 쿼리

내가 가진 말 :

<root> 
    <parent attribute="A">A<child>A</child></parent> 
    <parent attribute="B">B<child>B</child></parent> 
</root> 

를 지금까지 내가 방법 :

/root/parent/child/text() 

가 번역 :

/*[local-name()='root']/*[local-name()='parent']/*[local-name()='child']/text() 

하지만이 같은 것들과 사투를 벌인거야 :

/root/parent[@attribute="A"]/child/text() 

나 :

/root/parent[text()="B"]/child/text() 

나 :

/root/parent[1]/child/text() 

방법이 번역합니까?

감사합니다,

편집 : 하나 더 :-)

<root> 
     <parent> 
      <childName>serverName</childName> 
      <childValue>MyServer</childValue> 
     </parent> 
     <parent> 
      <childName>ServerLocation</childName> 
      <childValue>Somewhere</childValue> 
     </parent> 
</root> 

이 어떻게 번역 않는

?

/root/parent[childName="serverName"]/childValue/text() 
+0

좋은 질문, 하나가 될 것 될 것입니다. 제공된 모든 XPath 표현의 권장 사항, 경고 및 완전한 번역에 대한 내 대답을 참조하십시오. –

답변

10

내가 주위에 본 적이 나를 혼란 네임 스페이스 불가지론 구문.

첫째, 나는 그것이 혼란 특히,이 구문을 사용하는 당신에게하지을 권합니다. 또한 오류가 발생할 수 있습니다 - 내 대답의 끝 부분을 참조하십시오.

네임 스페이스에있는 XPath 표현식 이름을 지정하는 표준 방법은 네임 스페이스를 XPath 엔진에 등록한 다음 (해당 벤더별 설명서 참조) 등록 된 네임 스페이스에 바인딩 된 접두어를 사용하는 것입니다 "x"라고 부름) x:someName

이 주제에 대한 좋은 답변이 많이 있습니다. 그 중 하나를 사용하십시오.

이제 몇 가지 이유로 인해 당신은 여전히 ​​그 혼란 구문을 사용하기로 결정하는 경우 :

을하지만 난 같은 것들로 사투를 벌인거야 :

/root/parent[@attribute="A"]/child/text()

사용 :

/*[local-name()='root']/*[local-name()='parent' and @attribute='A'] 
다음

:

나 :

/root/parent[text()="B"]/child/text()

사용 : 다음

/*[local-name()='root']/*[local-name()='parent' and text()='B'] 
            /*[local-name()='child']/text() 

:

나 :

/root/parent[1]/child/text() 

사용 :

/*[local-name()='root']/*[local-name()='parent'][1] 
           /*[local-name()='child']/text() 

다음 :

한 번 더

<root> 
    <parent> 
     <childName>serverName</childName> 
     <childValue>MyServer</childValue> 
    </parent> 
    <parent> 
     <childName>ServerLocation</childName> 
     <childValue>Somewhere</childValue> 
    </parent> 
</root> 

:-)

번역 방법은 무엇입니까?

/root/parent[childName="serverName"]/childValue/text() 

사용 다음 XML 문서에 같은 지역에 요소가있는 경우

이러한 표현이 원하는 노드를 선택하지 않을 수 있습니다

/*[local-name()='root'] 
     /*[local-name()='parent'][*[local-name()='childName"]='serverName'] 
              /*[local-name()='childValue']/text() 

주의 마십시오 -name은 두 개의 다른 네임 스페이스에 속합니다.

+0

1 +1 초 53 초. :-) – LarsH

+0

+1 모두. – Flack

+0

Dimitre에게 감사드립니다. 경고를주의 깊게 생각해보십시오 :-) 불행히도 시스템 검색 기능의 InstallShield에서 사용해야하기 때문에 xpath 유형을 사용해야합니다. 불행히도이 기능은 네임 스페이스를 정의 할 방법을 제공하지 않습니다. 검색하는 XML 파일에는 1 개의 네임 스페이스가 있으므로 안전합니다. BTW는 Tomcat web.xml 구성 파일입니다. 감사! –

4

나는이 XPath 표현식을 네임 스페이스에 무관심하게 만들려면 어떻게해야합니까? (그것은 특수 구문, 로컬 이름() 함수의 단지 일반적인 사용하지 않습니다.)

/root/parent[@attribute="A"]/child/text() 

/*[local-name()='root']/*[local-name()='parent'][@attribute='A']/*[local-name()='child']/text() 

(당신은 속성 값을 큰 따옴표를 사용할 수 있습니다 될 것입니다 당신이 경우 하지만 XSLT 나 환경이 무엇이든간에 포함하기가 더 어려워 질 수 있습니다.)

/root/parent[text()="B"]/child/text() 

/*[local-name()='root']/*[local-name()='parent'][text() = 'B']/*[local-name()='child']/text() 

그리고

/root/parent[1]/child/text() 

/*[local-name()='root']/*[local-name()='parent'][1]/*[local-name()='child']/text() 
+0

+1 거의 거의 빠르기 때문에 +1 : –

+0

길게 보지 :) 어디 있었습니까? 나는 이것이 당신에게 흥미로울 것 같다고 생각합니다 : http://dnovatchev.wordpress.com/2011/02/08/the-binary-search-tree-data-structurehaving-fun-with-xpath-3-0/ –

+0

+1 너 둘 다. – Flack

관련 문제