【问题标题】:Java - convert web service response (StreamResult) to XML in order to retrieve child valueJava - 将 Web 服务响应 (StreamResult) 转换为 XML 以检索子值
【发布时间】:2017-06-27 10:24:28
【问题描述】:

我的代码完成如下:

        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        Source sourceContent = soapResponse.getSOAPPart().getContent();
        System.out.print("\nResponse SOAP Message = ");
        StreamResult result = new StreamResult(System.out);
        transformer.transform(sourceContent, result);

它在控制台中有这个输出(结果在 ONE OUTPUT 行中,但为了更清楚,我会像漂亮的 xml 一样复制粘贴它)。

<?xml version="1.0" encoding="UTF-8"?>
<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>
    <VerifyEmailResponse xmlns="http://ws.cdyne.com/">
      <VerifyEmailResult>
        <ResponseText>Mail Server will accept email</ResponseText>
        <ResponseCode>3</ResponseCode>
        <LastMailServer>gmail-smtp-in.l.google.com</LastMailServer>
        <GoodEmail>true</GoodEmail>
      </VerifyEmailResult>
    </VerifyEmailResponse>
  </soap:Body>
</soap:Envelope>

所以这完全可以。现在,如果我只想拥有 ResponseText 或 ResponseCode 值并将它们放在某些字段中,我该如何将此结果处理为 XML 以及如何获取该 XML 元素?

我也看了这个问题Convert StreamResult to string or xml,但我看不到与我的问题的关系,因为我的课程代码中已经有 ANSWER 但我无法处理 RESULT(将它作为我可以处理的 XML此外) 如果我只添加

StringWriter writer = new StringWriter();
String resultString2=writer.toString();

我没有引用已经有输出的 RESULT 变量。

我也试过这个:

result.getOutputStream().toString();

但结果是

java.io.PrintStream@3b9a45b3

result.toString(); 也没有给我想要的结果

如何将此输出到 XML 元素,我可以从中检索和获取特定的 XML 元素?

提前谢谢你,

【问题讨论】:

  • 为什么不使用DOM解析器来解析你的xml并获取节点属性
  • 您好,您能告诉我如何将此结果变量转换为 DOM 以便能够获取特定的 XML 元素吗?谢谢
  • RESULT 必须以这种方式返回,因为我正在使用一些已经存在的类。但现在我希望将其转换为 DOM 或 XML,以便能够从完整输出中获取特定的 XML 元素
  • 你看到了吗

标签: java xml soap stream xmlstreamreader


【解决方案1】:

为了获得所需的元素,例如ResponseCode, ResponseText 来自 xml 的输出字符串,您可以使用以下内容:

因为你的 xml 有命名空间,xpath 应该知道这一点。所以你使用xpath.setNameSpaceContext(ns); 设置命名空间上下文,如下所示

TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
Source sourceContent = soapResponse.getSOAPPart().getContent();
System.out.print("\nResponse SOAP Message = ");

StringWriter sw = new StringWriter();
transformer.transform( sourceContent, new StreamResult( sw ) );

InputSource inputSource = new InputSource( new StringReader( sw.toString() ) );
XPath xpath = XPathFactory.newInstance().newXPath();

javax.xml.namespace.NamespaceContext ns = new javax.xml.namespace.NamespaceContext()
 {

    @Override
    public String getNamespaceURI(String prefix) {
        if ( "soap".equals( prefix ) )
        {
            return "http://schemas.xmlsoap.org/soap/envelope/";
        }
        else if ( "xsi".equals( prefix ) )
        {
            return "http://www.w3.org/2001/XMLSchema-instance";
        }
        else if ( "xsd".equals( prefix ) )
        {
            return "http://www.w3.org/2001/XMLSchema";
        }
        else if ( "xml".equals( prefix ) )
        {
            return javax.xml.XMLConstants.XML_NS_URI;
        }
        else if( "responsens".equals( prefix ) )
        {
            return "http://ws.cdyne.com/";
        }


        return javax.xml.XMLConstants.NULL_NS_URI;

    }

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

    @Override
    public Iterator<?> getPrefixes(String namespaceURI) {
                return null;
    }

 };
 xpath.setNamespaceContext(ns);
 Object obj = xpath.evaluate("//responsens:ResponseText/text()", inputSource, XPathConstants.STRING );
 if ( obj != null ) 
 { 
       String responseText = obj.toString();
       System.out.println("Response text : " + responseText);
 }

 inputSource = new InputSource( new StringReader( sw.toString() ) );
  //To get Response code:
 obj = xpath.evaluate("//responsens:ResponseCode/text()", inputSource, XPathConstants.STRING );
 if ( obj != null ) 
 { 
    String responseCode = obj.toString();
    System.out.println("Response code : " + responseCode);
 }

【讨论】:

  • 您的 sw.toString() 中的 xml 字符串是否正确?我的意思是它是格式良好的xml吗?
  • 你的 InputSource 是什么?是org.xml.sax.InputSource 吗?你可以在你的导入中看到它。
  • 不,您应该在以下位置得到异常: Object obj = xpath.evaluate("//ResponseCodet/text()", is, XPathConstants.STRING );
  • 好的。固定的。 is 应该是 inputSourcein 应该是 sw.toString() - 已更新。
  • 它是一个虚拟的命名空间来引用默认命名空间。在您的 xml 中,您有 xmlns="ws.cdyne.com",ResponseText 属于该名称空间,因此在 xpath 中我将其称为 responsens
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-22
相关资源
最近更新 更多