자식 노드에 속성이있는 노드 가져 오기


116

다음 XML이 있다고 가정합니다.

<book category="CLASSICS">
  <title lang="it">Purgatorio</title>
  <author>Dante Alighieri</author>
  <year>1308</year>
  <price>30.00</price>
</book>

<book category="CLASSICS">
  <title lang="it">Inferno</title>
  <author>Dante Alighieri</author>
  <year>1308</year>
  <price>30.00</price>
</book>

<book category="CHILDREN">
  <title lang="en">Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

<book category="WEB">
  <title lang="en">XQuery Kick Start</title>
  <author>James McGovern</author>
  <author>Per Bothner</author>
  <author>Kurt Cagle</author>
  <author>James Linn</author>
  <author>Vaidyanathan Nagarajan</author>
  <year>2003</year>
  <price>49.99</price>
</book>

<book category="WEB">
  <title lang="en">Learning XML</title>
  <author>Erik T. Ray</author>
  <year>2003</year>
  <price>39.95</price>
</book>

언어 속성이 "it"인 제목 노드가있는 모든 책 노드를 다시 가져 오는 xpath를 수행하고 싶습니다.

내 시도는 다음과 같습니다.

//book[title[@lang='it']]

그러나 그것은 작동하지 않았습니다. 노드를 다시 가져올 것으로 예상합니다.

<book category="CLASSICS">
  <title lang="it">Purgatorio</title>
  <author>Dante Alighieri</author>
  <year>1308</year>
  <price>30.00</price>
</book>

<book category="CLASSICS">
  <title lang="it">Inferno</title>
  <author>Dante Alighieri</author>
  <year>1308</year>
  <price>30.00</price>
</book>

힌트가 있습니까?


이것은 어떤 XPath 구현입니까?
Pavel Minaev

답변:


175

시험

//book[title/@lang = 'it']

이것은 다음과 같습니다.

  • 모든 book요소를 얻다
    • 적어도 하나가있는 title
      • 속성이있는 lang
        • 값으로 "it"

이것이 도움 될 것 입니다. Ronald Bourret의 "XPath in Five Paragraphs" 라는 제목의 기사 입니다.

그러나 솔직히 말해서 //book[title[@lang='it']]XPath 엔진에 "문제"가없는 한 위의 내용은 동일해야합니다. 따라서 우리에게 보여주지 않은 코드 나 샘플 XML의 내용 일 수 있습니다. 예를 들어 샘플은 XML 조각입니다. 루트 요소에 네임 스페이스가 있고 쿼리에서이를 계산하지 않을 수 있습니까? 그리고 당신은 그것이 작동하지 않는다고 우리에게만 말했지만 당신이 얻은 결과를 우리에게 말하지 않았습니다.


4
어떻게하면 동일한 작업을 수행 할 수 title의 직접적인 아이가 아닌 book깊은 곳,하지만 우리는 어디에 정확히 몰라? //book[/title/@lang = 'it']작동하지 않는 것 같습니까?
Martin Konicek 2013 년

5
Martin, //book[.//title/@lang = 'it']를 사용할 수 있습니다. 나는 트릭이 "."라고 믿는다. 조건의 시작 부분에.
Bruno Caponi

1
링크, 훌륭한 기사에 감사드립니다. 수년 동안 xPath를 사용해 왔지만 이것이 근본적인 논리를 이해하는 데 정말 도움이되었습니다!
swensor

57

몇 년 후, 유용한 옵션은 XPath Axes ( https://www.w3schools.com/xml/xpath_axes.asp ) 입니다. 보다 구체적으로, 하위 축을 사용하려고합니다 .

이 예가 트릭을 할 것이라고 믿습니다.

//book[descendant::title[@lang='it']]

이것은 당신이 모두를 선택할 수 있습니다 booktitle 'it'과 같은 언어 속성 값 을 포함하는 하위 요소 (중첩 된 정도에 관계없이) 를 포함하는 요소 .

그 당시 XPath Axes가 존재했다고 100 % 확신하지 못하기 때문에이 답변이 2009 년과 관련이 있는지 여부는 확신 할 수 없습니다. 내가 확인할 수있는 것은 그것들이 오늘날 존재한다는 것과 나는 그것들이 XPath 탐색에서 매우 유용하다는 것을 알았고 여러분도 그렇게 될 것이라고 확신합니다.


12
//book[title[@lang='it']]

실제로는

 //book[title/@lang = 'it']

vtd-xml을 사용하여 시도했는데 두 식 모두 동일한 결과를 뱉어냅니다. 어떤 xpath 처리 엔진을 사용 했습니까? 적합성 문제가 있다고 생각합니다. 아래 코드는

import com.ximpleware.*;
public class test1 {
  public static void main(String[] s) throws Exception{
      VTDGen vg = new VTDGen();
      if (vg.parseFile("c:/books.xml", true)){
          VTDNav vn = vg.getNav();
          AutoPilot ap = new AutoPilot(vn);
          ap.selectXPath("//book[title[@lang='it']]");
                  //ap.selectXPath("//book[title/@lang='it']");

          int i;
          while((i=ap.evalXPath())!=-1){
              System.out.println("index ==>"+i);
          }
          /*if (vn.endsWith(i, "< test")){
             System.out.println(" good ");  
          }else
              System.out.println(" bad ");*/

      }
  }
}

+1은 준수 문제이며 구문이 동일한 노드 세트를 생성합니다. C #의 유사한 코드도 작동합니다.
Zach Bonham

-1 : Mr. Zhang, 질문과 관련이없는 코드를 제거하여 호의를 베풀려고했습니다. 그것은 내가 당신을 비하하지 않을 수있게 해주었습니다. 다른 응답에는 쿼리를 호출하는 코드가 포함되어 있지 않습니다.
John Saunders

6
+1 : Mr. Saunders가 무슨 말을하는지 알 수 없기 때문에-다른 답변은 코드를 추가하지 않았고이 답변은 사용 된 코드를 보여 주므로 1 : 그의 방법을 검증하고 2 : 테스트를 직접 수행 할 수 있습니다. 코드는 짧고 읽기 쉽습니다. 문제가 보이지 않습니다.
DuckPuppy 2011

4

귀하의 제안이 정확하다고 생각하지만 xml은 유효하지 않습니다. 당신이 실행하는 경우 //book[title[@lang='it']]<root>[Your"XML"Here]</root>다음 무료 온라인 XPATH 테스터 것과 같은 이곳은 예상 된 결과를 찾을 수 있습니다.


2

이 xPath 표현식을 사용해보십시오.

//book/title[@lang='it']/..

"it"언어로 된 모든 책 노드를 제공해야합니다.


2
그 표현의 결과는 책 노드가 아니라 제목 노드입니다
Caleth

2
그것은 사실이 아닙니다. 책 노드를 반환합니다 (끝에있는 두 개의 점은 제목 노드의 상위 노드를 목표로합니다).
user1113000 2019-04-03
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.