2011-05-12 178 views
0

我有一個我正在用Java處理的SOAP響應。它有一個包含幾個不同子元素的元素。我正在使用以下代碼嘗試抓取所有綁定節點,並找到哪個節點具有值爲ACTIVE的子標記。初始評估語句返回的NodeList包含4個節點,它們是SOAP響應中子節點的正確數量,但它們都是第一個元素的重複項。下面是代碼:XPath查詢返回重複節點

NodeList nodes = (NodeList)xpath.evaluate("//:bond", doc, XPathConstants.NODESET); 
for(int i = 0; i < nodes.getLength(); i++){ 
    HashMap<String, String> map = new HashMap<String, String>(); 
    Element bond = (Element)nodes.item(i); 

    // Get only active bonds 
    String status = xpath.evaluate("//:status", bond); 
    String id = xpath.evaluate("//:instrumentId", bond); 

    if(!status.equals("ACTIVE")) 
     continue; 

    map.put("isin", xpath.evaluate(":isin", bond)); 
    map.put("cusip", xpath.evaluate(":cusip", bond)); 
} 

感謝您的幫助, 賈裏德

回答

1

回答你的眼前問題是,像//:status表達式將會忽略你傳遞的節點,並從的根目錄開始文件。

但是,通過使用XPath將測試應用到節點,可能會比您獲得更簡單的解決方案。我想,這應該工作,儘管它可能包含錯別字(特別是,我不記得text()是否能站在自己的,或者必須在謂詞表達式中使用):

//:bond/:status[text()='ACTIVE']/.. 
+0

謝謝,這確實是問題。我得到它與以下字符串一起工作: //:bond [:status ='ACTIVE'] 我曾嘗試過這樣做,但在狀態之前省略了愚蠢的冒號,所以它不起作用。 – Jared