2010-07-05 67 views
4

我在使用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); 
+0

對不起@Bryn,我知道如何在C#中做到這一點,但我沒有使用JDOM的經驗:(所以,我刪除了我的答案。 – 2010-07-05 17:28:26

回答

1

奇怪,確實......我在我用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 
+2

謝謝安德烈亞斯 - 你讓我在這裏的正確軌道上。不幸的是,輸入是作爲一個已經構建的JDOM元素而來的,所以將它串行化以供SAXBuilder處理是一個小小的OTT。然而,只是通過玩弄它似乎只需要將元素包裝在文檔中 - 現在一切正常。想知道爲什麼如果有人能弄明白嗎? – 2010-07-05 20:48:24

+0

@BrynSadler將JDOM'Element'包裝在'Document'中就足夠了,我的一天就被保存了!非常感謝你! :) – 2011-11-08 12:08:54