2011-01-31 6 views
1

방금 ​​Xpath를 배우기 시작했습니다. 각 영화 부모 (자바를 통해!)의 모든 배우를 선택할 코드 줄을 작성하려고합니다. 아래에는 하나의 영화 예가 나와 있지만, 각각 개의 요소가있는 <Movie> 개의 요소가 여러 개 있습니다.Xpath : 모든 요소 유형을 선택 하시겠습니까?

<Movie Genre = 'Other'> 
    <Title>Requiem For A Dream</Title> 
    <ReleaseYear>2000</ReleaseYear> 
    <Director>Darren Aronofsky</Director> 
    <Actor Character = 'Sara Goldfarb'>Ellen Burstyn</Actor> 
    <Actor Character = 'Harry Goldfarb'>Jared Leto</Actor> 
    <Actor Character = 'Marion Silver'>Jennifer Connelly</Actor> 
    <Actor Character = 'Tyrone C. Love'>Marlon Wayans</Actor> 
</Movie> 

현재, 나는 각 <Movie> 요소의 첫 번째 <Actor> 요소를 선택할 수 있습니다 - 그것은 루프를 사용하지 않고 그들 모두를 선택할 수 있습니다?

System.out.println("Starring: " + xpath.evaluate("Actor", movieNode) + " as " + xpath.evaluate("Actor/@Character", movieNode) + "\n");

이 모든 모든 도움을 많이 감사합니다 경우 :

여기에 모든 <Movie> 요소의 첫 번째 <Actor> 요소를 표시 코드 내 현재 라인입니다!

+0

@Johannes : 당신이하고 싶은 것이 분명하지 않습니다. 전체 문서에서 모든'Actor' 요소를 선택 하시겠습니까? 또는 컨텍스트에서 일부 'Movie' 요소의 모든'Actor' 요소 하위를 선택하겠습니까? –

+1

이전에 Java에서 XPath를 사용하지는 않았지만 반환 유형을 String이 아닌 NodeSet으로 변경해야한다고 생각합니다 ('evaluate()'의 오버로드 사용). 거기에 API를 조금 더 멋지게 포장하는 라이브러리가있을 수 있다고합니다. 아, 그런데 문서의 모든 액터 요소를 선택하는 표현식은'// Actor'가됩니다 – CurtainDog

+0

@Alejandro : 모든 영화의 모든 하위 요소입니다. – Johannes

답변

4

아니요, 각각 Node에 대해 NodeList 번에 반복하는 for 루프가 메서드에서 반환됩니다.

NodeList nodes = (NodeList)xpath.evaluate("Actor", movieNode, XPathConstants.NODESET); 
for (int i = 0; i < nodes.getLength(); i++) { 
    Element actor = (Element)nodes.item(i); 
    String actorName = actor.getTextContent(); 
    String character = actor.getAttribute("Character"); 
    System.out.println("Starring: " + actorName + " as " + character + "\n"); 
} 

추신 : 좋은 영화 btw :-).

+0

감사합니다. 좋은 출발입니다! 액터의 이름은 Null로 반환되지만 모든 문자 이름이 출력됩니다. 이상하게 보입니다 만, 나는 그것을 통해 일할 것입니다. 정말 고마워! (또한, 단지 작은 메모, 그것은 "XPathConstants"이어야합니다 - 그냥 작은 오타!) – Johannes

+1

맞아, 그것은 대신에'getTextContent'이어야합니다; 'getNodeValue'는'Element' 타입의 노드에 대해서'null'을 리턴합니다. 지적 해 주셔서 고맙습니다, 지금은 잘 작동합니다. –