2009-09-22 22 views
74

が含まれているノードが、私は、次のXMLを持っていると仮定しなさい:のXPath:子ノードが属性

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

私は戻って、言語とタイトルノードを持つすべての本ノードを取得する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> 

任意のヒント:私は、ノードを取り戻すことを期待しますか?前もって感謝します。

+0

これはどのようなXPathの実装ですか? –

答えて

131

これは読み込み

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

試してみてください。

  • はすべてbook要素持って
    • を取得する属性を有する少なくとも1つのtitle

の値を持つ210

  • あなたはthisは役に立ち見つけること - それはロナルド・ブーレで"XPath in Five Paragraphs"と題した記事です。

    XPathエンジンに「問題」がない限り、すべての正直なところでは、//book[title[@lang='it']]と同等である必要があります。つまり、コードやサンプルXMLの中に、私たちが表示していないものがあります。たとえば、サンプルがXMLフラグメントです。ルート要素に名前空間があり、クエリにそれが含まれていない可能性がありますか?そして、あなたは私たちにそれがうまくいかないと言っただけですが、あなたが得た結果を教えてくれませんでした。

+0

mm、興味深い読書。 –

+1

'title 'が' book'の直接の子ではないが、もっと深いところではどこが正確にわからないのか? '// book [/ title/@ lang = 'it']'は動作していないのでしょうか? –

+0

+1 Ronald Bourretの記事 – w5m

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

私はVTD-XMLを使用して、それを試してみました実際

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

に相当し、両方の式は同じ結果を吐き出す... あなたはどのようなXPathの処理エンジンを使用しましたか?私は

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

「それ」にあなたのすべての書籍のノードを与える必要があります。LANG

+0

+1はコンプライアンスの問題であり、シンタックスは同じノードセットを生成することを示しています。 C#の同様のコードも動作します。 –

+0

-1:張氏、私はあなたに質問に関係のないコードを削除して賛成しようとしていました。それは、私があなたに下降気味にすることを許しました。クエリを呼び出すコードを含む他の回答はありません。 –

+4

+1:サンダーズ氏の話しが分からないので、他の回答には何もコードが追加されていないので、この回答はコードを使用しているので、私たちは方法を検証し、2:コードは短くて読みやすい。私は問題を見ない。 – DuckPuppy

2

このXPath式を使用してみてくださいでいると思いますあなたの提案は正しいと思うが、XMLはあまり有効ではない。 <root>[Your"XML"Here]</root>//book[title[@lang='it']]を実行している場合は、hereのような無料のオンラインxPathテスターでは、期待どおりの結果が得られます。

+0

その式の結果は、書籍ノードではなくタイトルノードである – Caleth

2

う:私はそれが適合の問題以下 コード

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

     } 
    } 
} 
30

年後ですが、便利なオプションはXPath軸(https://www.w3schools.com/xml/xpath_axes.asp)を使用することです。具体的には、子孫軸を使用します。

私は、この例では、トリックを行うだろうと信じて

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

これはあなたが 'と同じ言語属性値を含む子title要素(関係なく、それが入れ子になっているどのように深いのを)含むすべてのbookの要素を選択することができますそれ'。

この回答が2009年に関連するかどうかは、その時点でXPath軸が存在することを100%確信しているとは確信できません。私が確認できるのは、今日存在していることです。XPathのナビゲーションでは非常に便利であることがわかりました。私は確信しています。

関連する問題