【问题标题】:Soap response message parsing using XPath使用 XPath 解析 Soap 响应消息
【发布时间】:2011-11-16 06:04:42
【问题描述】:

我尝试使用 xpath 解析soap响应,位于响应消息的一些代码下方。

 <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:Body>
<ns1:Get__CompIntfc__CI_PERSONAL_DATAResponse
xmlns:ns1="http://xmlns.oracle.com/Enterprise/Tools/schemas/M985361.V1">
<ns1:PROP_EMPLID>AA0001</ns1:PROP_EMPLID>
<ns1:PROP_LAST_NAME>Adams</ns1:PROP_LAST_NAME><ns1:PROP_FIRST_NAME>Kimberly</ns1:PROP_FIRST_NAME>
</ns1:Get__CompIntfc__CI_PERSONAL_DATAResponse >
</soapenv:Body>
</soapenv:Envelope>

我尝试像...一样解析它

DocumentBuilderFactory domFactory =DocumentBuilderFactory.newInstance();
     domFactory.setNamespaceAware(true); 
     DocumentBuilder builder = domFactory.newDocumentBuilder();
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     response.writeTo(out); 
InputStream is = new ByteArrayInputStream( out.toByteArray() ); 
Document doc = builder.parse( is );
        XPathExpression expr = xpath.compile("//ns1:PROP_EMPLID/text()");
           Object res = expr.evaluate(doc, XPathConstants.NODESET);
           NodeList nodes = (NodeList) res;
    for (int i = 0; i < nodes.getLength(); i++) {
    System.out.println(nodes.item(i).getNodeValue()); 
       }

它没有给出所需的值“AA0001” 但是当我使用xpath.compile("//*/text()") 时,它会正确打印所有文本节点值。

请告诉我问题出在哪里,因为我想要响应中的一些特定值而不是所有文本值。

【问题讨论】:

标签: java xpath


【解决方案1】:

您正试图检索前缀 ns1 表示的命名空间中的一个节点,但您的应用程序不知道该前缀表示什么,因为您尚未将此名称与任何实际的命名空间。在 Java 中执行此操作的方法(如 @newtover 所述)是使用您的 xpath 对象注册 javax.xml.namespace.NamespaceContext 的实例。像这样的:

xpath.setNamespaceContext(namespaces);

很遗憾,此接口没有默认实现。你需要自己动手。一个完整的例子可以在这里找到:

...或关注@newtover 的链接。

【讨论】:

    【解决方案2】:

    你应该在你的 xpath 表达式中添加一个NamespaceContext

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-26
      相关资源
      最近更新 更多