4

XPath 式を使用して JDOM ドキュメントからいくつかの要素を抽出するのに非常にイライラしています。XML ドキュメントのサンプルを次に示します。ドキュメントから ItemCost 要素を完全に削除したいのですが、現時点では XPath 式を評価するのに問題があります。

  <srv:getPricebookByCompanyResponse xmlns:srv="http://ess.com/ws/srv">
     <srv:Pricebook>
        <srv:PricebookName>Demo Operator Pricebook</srv:PricebookName>
        <srv:PricebookItems>
           <srv:PricebookItem>
              <srv:ItemName>Demo Wifi</srv:ItemName>
              <srv:ProductCode>DemoWifi</srv:ProductCode>
              <srv:ItemPrice>15</srv:ItemPrice>
              <srv:ItemCost>10</srv:ItemCost>
           </srv:PricebookItem>
           <srv:PricebookItem>
              <srv:ItemName>1Mb DIA</srv:ItemName>
              <srv:ProductCode>Demo1MbDIA</srv:ProductCode>
              <srv:ItemPrice>20</srv:ItemPrice>
              <srv:ItemCost>15</srv:ItemCost>
           </srv:PricebookItem>
        </srv:PricebookItems>
     </srv:Pricebook>
  </srv:getPricebookByCompanyResponse>

通常は //srv:ItemCost などの式を使用してこれらの要素を識別しますが、これは他のドキュメントでは問題なく機能しますが、ここではリスト内の 0 ノードを継続的に返します。これが私が使用しているコードです:

Namespace ns = Namespace.getNamespace("srv","http://ess.com/ws/srv");   
XPath filterXpression = XPath.newInstance("//ItemCost");
filterXpression.addNamespace(ns);   
List nodes = filterXpression.selectNodes(response);

response は、上記の XML スニペット (XMLOutputter で検証済み) を含む JDOM 要素です。ノードは、このドキュメントを解析するたびに size()==0 を継続的に持ちます。同じドキュメントで Eclipse の XPath パーサーを使用しても、この式は機能しません。掘り下げた後、Eclipse エバリュエーターが //*[local-name() = 'ItemCost'] という式で動作するようになりましたが、Java コードの //srv:ItemCost をこれに置き換えても、結果は得られませんでした。XML から名前空間宣言を削除すると、//srv:ItemCost は Eclipse パーサーで正しく解決されますが、XML からは削除できません。私は今、これについて何時間も頭を悩ませてきましたが、正しい方向に少しずつ動かしていただければ幸いです.

どうもありがとう

編集:修正コード -

Document build = new Document(response);
XPath filterXpression = XPath.newInstance("//srv:ItemCost");
List nodes = filterXpression.selectNodes(build);
4

1 に答える 1

2

確かに奇妙です...私はjdomで私の側でテストしましたが、あなたのスニペットは空のリストを生成しました.次は意図したとおりに機能します:

public static void main(String[] args) throws JDOMException, IOException {
    File xmlFile = new File("sample.xml");
    SAXBuilder builder = new SAXBuilder();
    Document build = builder.build(xmlFile);        
    XPath filterXpression = XPath.newInstance("//srv:ItemCost");
    System.out.println(filterXpression.getXPath());
    List nodes = filterXpression.selectNodes(build);        
    System.out.println(nodes.size());
}

次の出力が生成されます。

//srv:ItemCost
2
于 2010-07-05T19:15:12.957 に答える