2011-01-31 15 views
1

私はXpathを学び始めました。私は各映画の親(Javaを通して!)のすべての俳優を選択するコード行を書こうとしています。以下は、1つの映画の例ですが、複数の<Movie>要素があり、それぞれが<Actor>要素です。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>要素を選択することができます - それは、forループを使用せずに、それらのすべてを選択することが可能ですか?

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要素を選択する式は '// Actor'になります – CurtainDog

+0

@Alejandro:すべての映画のすべての子要素。 – Johannes

答えて

4

いいえ、それぞれNodeNodeListには、evaluateメソッドで返される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"); 
} 

PS:いい映画btw :-)。

+0

ありがとう、これは素晴らしいスタートです!俳優の名前はNullとして返されますが、すべての文字名が表示されています。それは奇妙に見えるが、私はそれを介して動作します。本当にありがとう! (また、ちょっとしたメモ、それは "XPathConstants"でなければなりません - ちょっとした誤字!) – Johannes

+1

そうではなく、代わりに 'getTextContent'でなければなりません。 'getNodeValue'は' Element'型のノードに対して 'null'を返します。指摘してくれてありがとう、それは今正常に動作するはずです。 –

関連する問題