在Java 1.5中使用SOAP信封包装和解包XML

时间:2012-10-05 16:23:22

标签: java xml soap java-5

我有一个XML文档作为字符串,它是没有SOAP信封的SOAP请求。我现在需要做以下事情:

  • 将请求发布到包含在SOAP信封中的Web服务
  • 使用解包的SOAP信封返回响应

实际的HTTP连接的东西很好,但我真的很挣扎包装和解包。我试图弄清楚如何在Java中进行这种XML操作,但无法弄清楚。以javax.xml pacakge为例,但发现它只是一个巨大的混乱。不幸的是我只限于Java 1.5而没有外部库,否则我可能会使用一些apache commons东西。

基本上我正在寻找的是一对像这样的方法:

/* Wraps the xml in a standard soap envelope */
String wrap(String xml)

/* Removes soap envelope from the xml */
String unwrap(String xml)

我认为wrap方法可能就像soapStart + xml + soapEnd一样简单,尽管如果不小心,xml标题可能会搞砸。但是对于我来说,展开过于棘手,因为你需要实际提取<soapenv:Body> 中的内容,确保你得到所需的名称空间声明等等。

我一直坐在这里几个小时,我仍然不知道......希望你们中的一些人这样做:)

2 个答案:

答案 0 :(得分:1)

您可以尝试使用正则表达式。 要查找信封内容:

String regex = "^<(soapenv:Envelope).*?>(.*?)</\\1>$";
Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);
Matcher matcher = pattern.matcher(xml);
matcher.matches();
String body = matcher.group(2);

像这样的东西

答案 1 :(得分:0)

消息的SOAP部分包含一个包含正文(可以包含数据或错误信息)和可选标头的信封。当您使用JAXM创建SOAP消息时,将为您创建SOAP部件,信封和正文:您只需创建正文元素。要做到这一点,你需要到body元素的父元素,即SOAP体。

为了到达SOAPMessage树中的任何对象,您必须从根开始遍历树,如以下代码行所示。例如,假设SOAPMessage是MyMsg,这里是为了获取SOAP主体而必须进行的调用:

SOAPPart MyPart = MyMsg.getSOAPPart();

SOAPEnvelope MyEnv = MyPart.getEnvelope();

SOAPBody MyBody = envelope.getBody();

此时,您可以为body元素创建一个名称(如Namespaces中所述),并将body元素添加到SOAPMessage中。

例如,以下代码行为body元素创建一个名称(XML标记的表示):

Name bodyName = envelope.createName("Temperature");

下一个代码行将body元素添加到正文:

SOAPBodyElement myTemp = MyBody.addBodyElement(bodyName);

最后,此代码行定义了body元素bodyName的一些数据:

myTemp.addTextNode("98.6");

参考:http://docs.oracle.com/cd/E19263-01/817-6026/SOAP.html