2011-05-12 139 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