JDOM、XPATH、および名前空間インタラクション
-
02-10-2019 - |
質問
XPath式を使用して、JDOMドキュメントからいくつかの要素を抽出する非常にイライラする時間を過ごしています。サンプルXMLドキュメントは次のとおりです。アイテムコスト要素をドキュメントから完全に削除したいと思いますが、現時点で何でも評価するために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);
応答は、上記のXMLスニペット(XMLOutputterで検証)を含むJDOM要素です。ノードには、このドキュメントを解析するたびにsize()== 0が継続的にあります。同じドキュメントでEclipseでXpathパーサーを使用すると、この式も機能しません。いくつかの掘削の後、私はEclipse評価者に次の式で動作させました://*[local-name()= 'itemCost']しかし、これはまだ結果をもたらしませんでした。私が気づいたもう1つのことは、XMLから名前空間宣言を削除した場合、// SRV:ItemCostはEclipse Parserで正しく解決しますが、XMLから削除することはできません。私は今、この時間のために頭をかき回してきましたが、正しい方向に微調整することに本当に感謝しています。
どうもありがとう
編集:修正コード -
Document build = new Document(response);
XPath filterXpression = XPath.newInstance("//srv:ItemCost");
List nodes = filterXpression.selectNodes(build);
解決
奇妙なことに...私は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
所属していません StackOverflow