1

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

  • 将请求发布到包装在 SOAP 信封中的 Web 服务
  • 返回未包装的 SOAP 信封的响应

实际的 HTTP 连接内容很好,但我真的在包装和展开方面苦苦挣扎。我试图弄清楚如何在 Java 中进行这种 XML 操作,但无法真正弄清楚。以javax.xml包装为例,但发现大多数情况下它只是一团糟。不幸的是,我仅限于 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> 确保您获得所需的命名空间声明等。

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

4

2 回答 2

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);

像这样的东西

于 2012-10-05T16:48:19.470 回答
0

消息的 SOAP 部分包含一个信封,该信封包含一个正文(可以包含数据或故障信息)和一个可选的标头。当您使用 JAXM 创建 SOAP 消息时,会为您创建 SOAP 部分、信封和正文:您只需创建正文元素。为此,您需要访问 body 元素的父元素,即 SOAP 主体。

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

SOAPPart MyPart = MyMsg.getSOAPPart();

SOAPEnvelope MyEnv = MyPart.getEnvelope();

SOAPBody MyBody = envelope.getBody();

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

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

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

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

SOAPBodyElement myTemp = MyBody.addBodyElement(bodyName);

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

myTemp.addTextNode("98.6");

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

于 2012-10-05T16:32:20.270 回答