Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将SOAPBody转换为字符串_Java_String_Soap - Fatal编程技术网

Java 如何将SOAPBody转换为字符串

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

我想把SOAPBody转换成String。最好的方法是什么?
我应该先将其转换为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和其他人来说,这是一个很好的答案。