我在使用XPath表達式從JDOM文檔中提取一些元素時非常沮喪。這裏有一個示例XML文檔 - 我想從文檔中完全刪除ItemCost元素,但是我現在無法獲得XPath表達式來評估此時的任何內容。JDOM,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'],但是用Java代碼替換// srv:ItemCost仍然沒有產生任何結果。我注意到的另一件事是,如果我從XML中刪除名稱空間聲明,// srv:ItemCost將在Eclipse解析器中正確解析,但我無法從XML中刪除它。我現在一直在爲我們的這段時間撓了撓頭,並且真的很感謝你向正確的方向發展。
非常感謝
編輯:固定碼 -
Document build = new Document(response);
XPath filterXpression = XPath.newInstance("//srv:ItemCost");
List nodes = filterXpression.selectNodes(build);
對不起@Bryn,我知道如何在C#中做到這一點,但我沒有使用JDOM的經驗:(所以,我刪除了我的答案。 – 2010-07-05 17:28:26