2016-07-22 16 views
2

私のXMLファイルXPathで何も選択しないのはなぜですか?

<classifications> 
    <classification sequence="1"> 
    <classification-scheme office="" scheme="CS" /> 
    <section>G</section> 
    <class>01</class> 
    <subclass>R</subclass> 
    <main-group>33</main-group> 
    <subgroup>365</subgroup> 
    <classification-value>I</classification-value> 
    </classification> 
    <classification sequence="2"> 
    <classification-scheme office="" scheme="CS" /> 
    <section>G</section> 
    <class>01</class> 
    <subclass>R</subclass> 
    <main-group>33</main-group> 
    <subgroup>3415</subgroup> 
    <classification-value>A</classification-value> 
    </classification> 
    <classification sequence="1"> 
    <classification-scheme office="US" scheme="UC" /> 
    <classification-symbol>324/300</classification-symbol> 
    </classification> 
    <classification sequence="2"> 
    <classification-scheme office="US" scheme="UC" /> 
    <classification-symbol>324/307</classification-symbol> 
    </classification>   
</classifications> 

私は、私は、XPath、

以下
NodeList usClassification = (NodeList)xPath.compile("//classifications//classification//classification-scheme[@office=\"US\"]//classification-symbol//text()").evaluate(xmlDocument, XPathConstants.NODESET); 

と試みた条件office="US"

と一緒に以下の条件 必要なすべてのclassification-symbol要素の値と値を解析したいが、空の結果セットが得られました。

System.out.println(usClassification.getLength()); //its becomes zero 
+1

このように "//"を無差別に使用しないようにしてください。これは怠惰な習慣です。同じパスで4回実行すると、特にソースドキュメントが大きい場合は、パフォーマンスが著しく低下する可能性があります。 –

+0

特に、 '/'(子孫を選択する)と '/'(直接の子を選択する)の機能上の違いは、あなたのXMLとは関係がないからです。 – kjhughes

答えて

3

(読みやすくするために2行に書かれた)このXPathの、

/classifications/classification[classification-scheme/@office='US'] 
       /classification-symbol/text() 

classification要素のclassification-symbolテキストを選択しますrequとして

324/300 
324/307 

USに等しいclassification-scheme@office属性値を持ちますested。

+0

ありがとうございました。 – Prabu

3

classification-symbolは、classification-schemeの子ではありません。それらはの兄弟です。です。代わりに「シンボル」に「スキーム」から取得するfollowing-sibling軸を使用します。

//classifications/classification/classification-scheme[@office=\"US\"]/following-sibling::classification-symbol/text() 
+0

これは、同じようにうまくいく(+ 1)代替アプローチです。 – kjhughes

関連する問題