java – JDOM,XPath和命名空间交互
发布时间:2020-12-15 02:20:56 所属栏目:Java 来源:网络整理
导读:我在使用XPath表达式从JDOM文档中提取一些元素时非常令人沮丧.这是一个示例 XML文档 – 我想完全从文档中删除ItemCost元素,但是我现在无法获得XPath表达式来评估任何内容. srv:getPricebookByCompanyResponse xmlns:srv="http://ess.com/ws/srv" srv:Pricebo
我在使用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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |