다음 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']]
이것은 당신이 모두를 선택할 수 있습니다 book
title
‘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”언어로 된 모든 책 노드를 제공해야합니다.