2012-01-19 7 views
1

私のプログラムでは、以下に示すxmlファイルをダウンロードしています。JDOM/Jaxenを使用したXPathの問題

タスクは、すべての属性 通貨とレートを抽出するのは非常に簡単でなければなりません。

私はJDOMを使用していますが、次のように開始しました:

try { 
    // TODO code application logic here 
    SAXBuilder builder = new SAXBuilder(); 
    org.jdom.Document doc = builder.build("test.xml"); 
    List<?> all = XPath.selectNodes(doc, "/Envelope/Cube/Cube/@currency"); 
    for(Object o : all) { 
     Attribute att = (Attribute) o; 
     System.out.println("ausgbabe: " + att); 
    } 
} 

を持っているエントリを取得するには、いくつかのパスをテストしたが、それは動作しません。

<?xml version="1.0" encoding="UTF-8"?> 
<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref"> 
    <gesmes:subject>Reference rates</gesmes:subject> 
    <gesmes:Sender> 
     <gesmes:name>European Central Bank</gesmes:name> 
    </gesmes:Sender> 
    <Cube> 
     <Cube time='2012-01-17'> 
      <Cube currency='USD' rate='1.2790'/> 
      <Cube currency='JPY' rate='98.20'/> 
      <Cube currency='BGN' rate='1.9558'/> 
      <Cube currency='CZK' rate='25.650'/> 
      <Cube currency='DKK' rate='7.4353'/> 
      <Cube currency='GBP' rate='0.83045'/> 
     </Cube> 
    </Cube> 
</gesmes:Envelope> 
+1

どのように動作していませんの? – OrangeDog

答えて

1

xmlにはXPathエンジンについて語らなかった名前空間があります。 javax.xml.namespace.NamespaceContextを使用する必要があります。詳しくは、this articleを参照してください。

6

xpathオブジェクトに名前空間をバインドする必要があります。

XPath xpath = XPath.newInstance("/gesmes:Envelope/root:Cube/root:Cube/root:Cube/@currency"); 

はそれにあなたの名前空間宣言を追加します:実際に

xpath.addNamespace("gesmes", "http://www.gesmes.org/xml/2002-08-01"); 
xpath.addNamespace("root", "http://www.ecb.int/vocabulary/2002-08-01/eurofxref"); 

、あなたは(私はあなたのXPathに新しいキューブエントリを追加する必要がありました)このようなXPathのオブジェクトを作成する必要がありますEnvelope要素には "http://www.gesmes.org/xml/2002-08-01"という名前空間URIがあり、すべてのCube要素には "http://www.ecb.int/vocabulary/2002-08- 01/eurofxref "namespace uri、デフォルトの名前空間として宣言されています。 xpathに必要な名前空間接頭辞を使用できますが、uriは一致しなければなりません。
は、その後、あなたが作成したXPathを使用して、このような文書を検索:

List<?> all = xpath.selectNodes(doc); 

私はあなたのxmlでこのコードをテストし、それが次の出力生成:

ausgbabe: [Attribute: currency="USD"] 
ausgbabe: [Attribute: currency="JPY"] 
ausgbabe: [Attribute: currency="BGN"] 
ausgbabe: [Attribute: currency="CZK"] 
ausgbabe: [Attribute: currency="DKK"] 
ausgbabe: [Attribute: currency="GBP"] 
+0

実際には、コードを変更しても機能しません。 – Alanmars

+0

まあ、私はあなたのXMLでこのコードを試して、それは動作します。私は答えを私の答えに加えました。コード内の3つのフラグメントをすべてコピーしたかどうか確認してください。 – javanna

+0

はい、動作します。問題はデフォルトの名前空間から発生します。 @javanna – Alanmars

関連する問題