Java XPath Compile无法查询具有唯一名称空间的标记

初级

我在这里遇到了许多问题,但似乎都无法解决我面临的问题

我得到了一个带有唯一命名空间的标签。我介绍了XML名称空间上下文,但是我的程序仍返回0个节点。

// Create DocumentBuilderFactory for reading xml file
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();

        factory.setNamespaceAware(true);

        Document doc = builder.parse(new InputSource(new StringReader(text)));

        // Create XPathFactory for creating XPath Object
        XPathFactory xPathFactory = XPathFactory.newInstance();

        // Create XPath object from XPathFactory
        XPath xpath = xPathFactory.newXPath();

        xpath.setNamespaceContext(new NamespaceContext() {
            public String getNamespaceURI(String prefix) {
                if ("cam".equals(prefix))
                    return "urn:xxx:1.0:logging";
                else if ("soapenv".equals(prefix))
                    return "http://schemas.xmlsoap.org/soap/envelope/";
                else if ("xml".equals(prefix))
                    return XMLConstants.XML_NS_URI;
                return XMLConstants.NULL_NS_URI;
            }

            // This method isn't necessary for XPath processing.
            public String getPrefix(String uri) {
                throw new UnsupportedOperationException();
            }

            // This method isn't necessary for XPath processing either.
            public Iterator getPrefixes(String uri) {
                throw new UnsupportedOperationException();
            }
        });

        // Compile the XPath expression for getting the response
         XPathExpression xPathExpr =
         xpath.compile("/cam:message/cam:response/soapenv:Envelope/soapenv:Header/Info[1]/property[@name='response']/text()");


        // XPath text example : executing xpath expression in java
        // Object result = xPathExpr.evaluate(doc, XPathConstants.NODESET);
        // NodeList nodes = (NodeList) result;
        // int length = nodes.getLength();

        String result1 = (String) xPathExpr.evaluate(doc, XPathConstants.STRING);

XML看起来像

 <cam:message xmlns="urn:xxx:1.0:logging">
         <cam:response>
           <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
               <soapenv:Header xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
                   <Info xmlns="urn:xxx:1.0:xxx.core.xxx.Service1">
                      <property name="response">some value</property>
                 </Info>
                 <Info xmlns="urn:xxx:1.0:xxx.core.xxx.Service2">
                      <property name="response">i am interested in this value</property>
                 </Info>
               </soapenv:Header>
           </soapenv:Envelope>
     </cam:response>
</cam:message>

因此,标签<Info xmlns="urn:xxx:1.0:xxx.core.xxx.Service2">具有其自己的名称空间。我的程序没有为此返回值。类似地,有很多Info标签。我对第二个Info标记感兴趣,该标记具有以Service2结尾的名称空间。

请帮忙

韦罗

您当前的XPath表达式仅匹配Info和property元素,没有名称空间uri。

您必须将urn:...Service2-namespace添加NamespaceContext内部类中:

public String getNamespaceURI(String prefix) {
    if ("cam".equals(prefix))
       // like abvce
    else if ("s2".equals(prefix))
       return "urn:xxx:1.0:xxx.core.xxx.Service2";
    else
       return XMLConstants.NULL_NS_URI;
}

和限定Info,并property相应地在你的XPath步,用前缀s2

xpath.compile("/cam:message/cam:response/soapenv:Envelope/soapenv:Header/s2:Info/s2:property[@name='response']/text()");

除此之外,您的代码和XML文件中还存在错误:

a)创建DocumentBuilder之后,使DocumentBuilderFactory可以感知名称空间改为写:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();

b)您的XML使用的前缀cam在根元素中未正确声明。改为写:

<cam:message xmlns:cam="urn:xxx:1.0:logging">
    ....

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带有变量的Java Xpath

来自分类Dev

Java XPath解析器对具有名称空间的文档的奇怪行为

来自分类Dev

具有唯一名称标题的表

来自分类Dev

创建具有唯一名称的元素

来自分类Dev

上载具有唯一名称的图像

来自分类Dev

上载具有唯一名称的图像

来自分类Dev

具有XPath的Java硒查找元素

来自分类Dev

具有XPath的Java硒查找元素

来自分类Dev

具有名称空间的xpath查询根元素

来自分类Dev

使用xpath查询Java读取xml

来自分类Dev

具有名称空间的PostgresSQL xpath

来自分类Dev

带有默认命名空间问题的Java XPath

来自分类Dev

具有XMLUnit 2和默认命名空间的Java XPath

来自分类Dev

XPath选择Java中具有指定名称的文档中的所有节点

来自分类Dev

具有唯一名称的排行榜

来自分类Dev

使用dplyr重命名具有唯一名称的多列的快速方法

来自分类Dev

获取具有非唯一名称的命名Vector值

来自分类Dev

生成具有唯一名称的PRN文件

来自分类Dev

唯一名称的子集

来自分类Dev

Java XPath“ if”语句

来自分类Dev

XPath Parser Java冗余

来自分类Dev

XPath 中带有字符串变量的 Java XPath 语法

来自分类Dev

如何重复使用具有唯一名称和标记的相同预制件并添加到C#列表中

来自分类Dev

Java:如何在节点上执行XPath查询

来自分类Dev

如何在Java XPath查询中使用name()和/或node()?

来自分类Dev

Java-获取Xpath查询的HTML页面源代码

来自分类Dev

XPath查询中的XPath查询

来自分类Dev

XPath查询中的XPath查询

来自分类Dev

使用 java 和 Xpath 获取 xml 的所有属性