如何将SOAPBody转换为String

时间:2014-08-05 22:44:53

标签: java string soap

我想将SOAPBody转换为String。最好的方法是什么? 我应该先将其转换为xml,然后将其转换为String,或者我们可以将其转换为String。

3 个答案:

答案 0 :(得分:23)

从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。

答案 1 :(得分:3)

想到这可能会有所帮助 -

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 Document to String?

答案 2 :(得分:0)

您不需要将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(....)来配置序列化程序。