Java 如何将SOAPBody转换为字符串
我想把SOAPBody转换成String。最好的方法是什么?Java 如何将SOAPBody转换为字符串,java,string,soap,Java,String,Soap,我想把SOAPBody转换成String。最好的方法是什么? 我应该先将其转换为xml,然后再将其转换为字符串,还是可以将其转换为字符串。从SOAPMessage开始时,最简单的方法是使用writeTo方法: ByteArrayOutputStream stream = new ByteArrayOutputStream(); soapMessage.writeTo(stream); String message = new String(stream.toByteArray(), "utf-8
我应该先将其转换为xml,然后再将其转换为字符串,还是可以将其转换为字符串。从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)或MTOM。然而,SOAPBody绝对是纯XML。认为这可能会有所帮助-
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();
}
感谢下面的帖子-
您不需要将
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(..)
来配置序列化程序。只是想澄清一下:您是在谈论javax.xml.soap.SOAPBody吗?你有权访问SOAPMessage实例吗?是的,我说的是javax.xml.soap.SOAPBody,我也有权访问SOAPMessage。我需要它来访问SOAPBody,看起来这样可以。我试着用SOAPBody通过tearrayoutputstream,但是没有成功,因为你提到的原因。谢谢你的回答。如果我只做这个SOAPBody元素=//任意字符串体=element.toString();在这种情况下使用toString的缺点是什么?在SOAPBody对象上调用toString可能会或可能不会像您预期的那样工作,这取决于您的SAAJ实现。然而,在调用toString时序列化其XML内容并不是SOAPBody契约的一部分。因此,我不相信它在任何地方/每次都能正确运行,我想知道是否调用soapMessage.writeTo(stream);帮助我绕过DOM。作为SOAPMessage,我有一个巨大的响应,我想让字符串自己使用StaX来解析它,但是afaiksaaj使用DOM,这意味着内存消耗是巨大的。因此,如果我在得到响应时立即执行soapMessage.writeTo(stream),是否会绕过创建DOM结构?这完全取决于实现。最后一个SAAJ实现是axis2,它使用Axiom作为解析器。Axiom可以将DOM树的构建推迟到某一点,并在直接操作时动态切换解析样式(即,不要让axis做这项工作,自己做)。用生的SAAJ,我想你会走运的。通过SpringWS这样的集成框架使用解析器,您可能会更好。这只适用于DOM级别3的实现。即使在2018年,信不信由你,它也不像人们想象的那样成为主流(在某些EE环境中,如Weblogic 11,这在我的脑海中是不存在的)。但对于JavaSE和其他人来说,这是一个很好的答案。