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

다음 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>

힌트가 있습니까?



답변

시험

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

이것은 다음과 같습니다.

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

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

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


답변

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

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

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

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

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


답변

//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 ");*/

      }
  }
}


답변

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


답변

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

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

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


답변