web-dev-qa-db-fra.com

Comment convertir SOAPBody en String

Je veux convertir SOAPBody en String. Quelle est la meilleure façon de procéder?.

11
ashish2k3

Lorsque vous partez d’un message SOAP, le moyen le plus simple consiste à utiliser la méthode writeTo:

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

(Ci-dessus, je suppose que votre implémentation SAAJ utilisera UTF-8, vous voudrez probablement vérifier).

Si vous démarrez depuis un SOAPBody, vous devriez probablement utiliser des API XML, sachant que SOAPBody est un org.w3.dom.Element, le moyen le plus simple serait probablement d'utiliser 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();

(Désolé, je n'ai pas mon IDE ici, je ne peux pas vérifier si cela compile, mais cela devrait être assez proche).

Remarque: un message SOAPMessage sérialisé peut ne pas être du XML brut: il peut s'agir d'une structure MIME: si le message SOAPMessage utilise réellement SwA (SOAP avec pièce jointe) ou MTOM. Cependant, SOAPBody est définitivement du pur XML.

22
GPI

Je pensais que cela pourrait aider -

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

Merci aux documents XML post - suivants en String?

3
Atanu Mukherjee

Vous n'avez pas besoin de convertir SOAPBody en XML car il implémente l'interface org.w3c.dom.Element; il s'agit donc déjà d'un objet XML valide . Vous pouvez utiliser le package org.w3c.dom.ls pour atteindre votre objectif:

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

Vous pouvez jouer avec serializer.getDomConfig().setParameter(....) pour configurer le sérialiseur.

0
user07