【问题标题】:Wrap and unwrap XML with SOAP envelope in Java 1.5在 Java 1.5 中使用 SOAP 信封包装和解包 XML
【发布时间】:2012-10-05 16:23:22
【问题描述】:

我有一个 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> 中的内容并且确保您获得所需的命名空间声明等。

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

【问题讨论】:

    标签: java xml soap java-5


    【解决方案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);
    

    类似的东西

    【讨论】:

    • 是的,考虑到这一点,如果不是命名空间,它可能会起作用。
    • 如果我理解你,你可以尝试更复杂的正则表达式: String regex = "^\"]*+(?: \"[^\"]*+\"[^>\"]*+)*+>(.*?)\\1>$" 提取封闭元素的内容
    【解决方案2】:

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

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

    SOAPPart MyPart = MyMsg.getSOAPPart();
    
    SOAPEnvelope MyEnv = MyPart.getEnvelope();
    
    SOAPBody MyBody = envelope.getBody();
    

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

    例如,以下代码行为正文元素创建一个名称(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

    【讨论】:

    • 我要导入什么来访问这些 SOAP 类?
    • 我相信它们是 Java 6 SE java.xml.soap 包的一部分
    • 啊...我仅限于 Java 5 :/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多