我正在使用SAAJ和Java 7来创建和发送SOAP消息。除了身体,我已经设置了所有东西。我需要将XML文件的内容放入SOAP消息的主体中,而不会出现任何格式错误。我尝试过使用DOM文档,我尝试使用扫描仪逐行读取并手动添加它,但它们都不起作用。 DOM文档解决方案最终只删除了消息的标题和正文,而我的其他解决方案仍然覆盖了“<”和“>”带有“<”的字符和“>”分别。我已经尝试使用String.replaceWith()来破解它,但是随着SOAP消息的发送,这种变化正在发生。有没有人知道如何实现这一点,而无需编写一个巨大的解析器,将从xml文件创建SAAJ对象?感谢。
答案 0 :(得分:2)
这个简单的测试对我有用:
import org.junit.*;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.xml.sax.InputSource;
import org.w3c.dom.Document;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPFactory;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPPart;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
/**
*
* @author gpeche
*/
public class SAAJTest {
@Test
public void testAddDocument() throws Exception {
String xml = "<a><b><c>hello</c><d test='attrib'>foo</d></b>blablabla</a>";
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new InputSource(new StringReader(xml)));
SOAPMessage message = MessageFactory.newInstance().createMessage();
SOAPBody body = message.getSOAPBody();
body.addDocument(doc);
message.saveChanges();
message.writeTo(System.out);
System.out.println();
}
}
输出:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><a><b><c>hola</c><d test="attrib">foo</d></b>blablabla</a></SOAP-ENV:Body></SOAP-ENV:Envelope>
答案 1 :(得分:0)
您也可以使用
SOAPMessage message = getSoapMessageFromString("<a><b><c>hello</c><d test='attrib'>foo</d></b>blablabla</a>");
private static SOAPMessage getSoapMessageFromString(String xml)
throws SOAPException, IOException {
MessageFactory factory = MessageFactory.newInstance();
// Create a new message object with default MIME headers and the data
// from the XML string we passed in
SOAPMessage message = factory
.createMessage(
new MimeHeaders(),
new ByteArrayInputStream(xml.getBytes(Charset
.forName("UTF-8"))));
return message;
}
如果您已经将xml文本解析为字符串对象而不关心解析或验证它。