Как преобразовать SOAPBody в String

Я хочу преобразовать SOAPBody в String. Каков наилучший способ сделать это? Должен ли я сначала преобразовать его в xml, а затем преобразовать в String или мы можем преобразовать его в String.

Ответ 1

При запуске из SOAPMessage самый простой способ - использовать метод writeTo:

ByteArrayOutputStream stream = new ByteArrayOutputStream();
soapMessage.writeTo(stream);
String message = new String(stream.toByteArray(), "utf-8") 

(Выше, я предполагаю, что ваша реализация SAAJ будет использовать UTF-8, вы, вероятно, захотите проверить).

Если вы начинаете с SOAPBody, то вы, вероятно, должны использовать XML API, поскольку SOAPBody является org.w3.dom.Element, самый простой способ, вероятно, будет использовать TrAX:

SOAPBody element = ... // Whatever
DOMSource source = new DOMSource(element);
StringWriter stringResult = new StringWriter();
TransformerFactory.newInstance().newTransformer().transform(source, new StreamResult(stringResult));
String message = stringResult.toString();

(Извините, у меня нет моей IDE прямо здесь, не могу проверить, компилируется ли это, но это должно быть довольно близко).

Обратите внимание: Сериализованное SOAPMessage может быть не сырым XML: это может быть MIME-структура: если SOAPMessage фактически использует SwA (SOAP With Attachment) или MTOM. Однако SOAPBody - это, безусловно, чистый XML.

Ответ 2

Возможно, это поможет -

private String convertToString (SOAPBody message) throws Exception{
   Document doc = message.extractContentAsDocument();
   StringWriter sw = new StringWriter();
   TransformerFactory tf = TransformerFactory.newInstance();
   Transformer transformer = tf.newTransformer();
   transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
   transformer.setOutputProperty(OutputKeys.METHOD, "xml");
   transformer.setOutputProperty(OutputKeys.INDENT, "yes");
   transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
   transformer.transform(new DOMSource(doc), new StreamResult(sw));
   return sw.toString();
  }

Благодаря следующему сообщению - XML-документ для строки?

Ответ 3

Вам не нужно преобразовывать SOAPBody в XML, потому что он реализует интерфейс org.w3c.dom.Element, поэтому это уже действительный объект XML. Вы можете использовать пакет org.w3c.dom.ls для достижения своей цели:

   String xmlAsString = null;
   Element element = what-ever-element;

   DOMImplementationLS domImplementationLS = (DOMImplementationLS)element.getOwnerDocument().getImplementation().getFeature("LS", "3.0");
   LSSerializer serializer = domImplementationLS.createLSSerializer();
   xmlAsString = serializer.writeToString(element);

Вы можете играть с serializer.getDomConfig().setParameter(....), чтобы настроить сериализатор.