使用XPath表达式从JDOM文档中提取某些元素的时间非常令人沮丧。这是一个示例XML文档-我想从文档中完全删除ItemCost元素,但是目前我无法获取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这样的表达式来标识这些元素,该表达式在其他文档上也可以正常工作,但是在这里它会连续返回List中的0个节点。这是我一直在使用的代码:
Namespace ns = Namespace.getNamespace("srv","http://ess.com/ws/srv");
XPath filterXpression = XPath.newInstance("//ItemCost");
filterXpression.addNamespace(ns);
List nodes = filterXpression.selectNodes(response);

其中response是一个包含上述XML代码段的JDOM元素(已使用XMLOutputter进行了验证)。解析此文档时,节点连续具有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);

最佳答案

确实很奇怪……我用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

10-07 18:31