java - 在 Java 中使用 XPath 解析 SOAP 消息

标签 java xml soap

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <ParentNode xmlns="http://namespace">
            <Status>Some_status</Satus>
            <Data>
                <Row>Some_row_data</Row>
            </Data>
        </ParentNode>
    </soap:Body>
</soap:Envelope>

在 API 调用中生成结构与上述类似的 SOAP 消息

SOAPMessagesoapMessage = getSoapMessage()

我想要做的是能够在我的 sope 消息之上运行 xPath 查询,即我想获取 Row 节点中的数据。

我做了什么:

XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xPath = xPathFactory.newXPath();
xPath.setNamespaceContext(new NamespaceContext() {
      @Override
      public String getNamespaceURI(String prefix) {
        return "http://namespace";
      }

      @Override
      public String getPrefix(String namespaceURI) {
        return null;
      }

      @Override
      public Iterator getPrefixes(String namespaceURI) {
        System.out.println(namespaceURI);
        return null;
      }
    });

SOAPBody body = soapMessage.getSoapBody();
Document document = body.extractContentAsDocument();

NodeList list = (NodeList)xPath.compile("/").evaluate(document, XPathConstants.NODESET);
Node node = list.item(0);
System.out.println(node.getFirstChild().getNodeName());

在根节点上运行它一切都很好,ParentNode 会打印到控制台。

但是,设置用以下内容替换我的 xPath 评估:

NodeList list = (NodeList)xPath.compile("/ParentNode").evaluate(document, XPathConstants.NODESET);

结果是一个空列表。我认为它与 namespace 有关,因此我用以下内容替换了查询:

NodeList list = (NodeList)xPath.compile("/*[name()='ParentNode']").evaluate(document, XPathConstants.NODESET);

这个似乎工作正常。我的问题是,如何正确设置命名空间上下文,以便我可以使用 xPath 查询,而无需在每个节点周围使用 name()=... ?我是否需要使用 DocumentBuilder 工厂并将其命名空间感知设置为 true?如果是这样,我如何将此 SOAP 消息提供给该工厂?

最佳答案

har07建议,向我的 xPath 查询添加任意前缀是正确解析我的 namespace 的技巧。结果,以下查询有效:

NodeList list = (NodeList)xPath.compile("/arbitraryprefix:ParentNode").evaluate(document, XPathConstants.NODESET);

关于java - 在 Java 中使用 XPath 解析 SOAP 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39799999/

相关文章:

java - JTable 单元格渲染器

java - 如何利用开发工具

c++ - arg 方向的 "in"和 "out"是什么意思?

xml - XML 中的 &lt;![CDATA[]]> 是什么意思?

web-services - 来自服务 WSDL 错误的 Worklight 应用程序框架数据对象

java - 如何使用 YAML 文件在 Spring Boot 中配置 Swagger?

xml - 我怎样才能让 git 忽略 Atmel Studio 的 .cproj 文件的某些部分?

c# - 用于下载大文件的 Asmx Web 服务

c# - 如何从 SOAP 响应 XML 创建 WCF 消息对象

JAVA修改XML文件