Java - преобразовать ответ веб-службы (StreamResult) в XML для получения дочернего значения

Мой код заканчивается так:

        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);

и у него есть этот вывод в консоли (результат находится в ОДНОЙ строке ВЫХОДА, но я скопирую и вставлю его как довольно 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?

Также я посмотрел этот вопрос Преобразовать StreamResult в строку или xml, но я не вижу связи с нашим вопросом, поскольку у меня уже есть код класса из ОТВЕТА, но я не могу обработать RESULT (чтобы он был в виде XML, который я могу обработать дополнительно) если добавить просто

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

У меня нет ссылки на мою переменную RESULT, которая уже имеет вывод.

Я попробовал это также:

result.getOutputStream().toString();

но результат

java.io.PrintStream@3b9a45b3

result.toString(); тоже не дает желаемого результата

Как получить этот вывод в элемент XML, из которого я могу получить и получить конкретный элемент XML?

Заранее спасибо,

1 ответ

Решение

Для того, чтобы получить желаемые элементы, например, ResponseCode, ResponseText из выходной строки, которая является XML, вы можете использовать следующее:

Поскольку у вашего xml есть пространства имен, xpath должен знать об этом. Таким образом, вы устанавливаете namespacecontext, используя 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);
 }
Другие вопросы по тегам