如何使用JDOM删除soap信封并将XML的其余部分作为字符串返回?

时间:2013-11-04 13:49:35

标签: java xml soap jdom-2

我有以下带有soap信封的XML作为Java String

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <MyStartElement xmlns="http://www.example.com/service">
      ...

我希望以后可以在其上使用hamcrest和xml-matchers扩展https://code.google.com/p/xml-matchers,但首先我想摆脱肥皂信封。

如何使用JDOM 2.0.5删除soap信封,并以MyStartElement的形式获取剩余的XML(即以String为根开头)?

我尝试了以下内容:

SAXBuilder builder = new SAXBuilder();
Document document = (Document) builder.build(toInputStream(THE_XML));
Namespace ns = Namespace
           .getNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
Namespace ns2 = Namespace
            .getNamespace("http://www.example.com/service");
Element response = document.getRootElement()
            .getChild("Body", ns)
            .getChild("MyStartElement", ns2);
System.out.println(new XMLOutputter().outputString(new Document(response)));

返回:线程“main”中的异常org.jdom2.IllegalAddException:内容已经存在父级“soap:Body”

我有类似的设置,我打电话给

System.out.println(new XMLOutputter().outputString(new Document(response)));

但是返回了整个XML,包括soap envelope。

使用JDOM从我的XML中剥离soap信封并获取String后,我需要做些什么?

奖金问题:

  • JDOM 2有一个很好的介绍/教程吗? (该网站似乎只有 JavaDocs,这使得它开始有点困难...)
  • 我意识到使用JDOM可能有点超过这个。关于如何以更简单的方式做到这一点的任何建议?

1 个答案:

答案 0 :(得分:2)

JDOM内容一次只能附加到一个父级(元素/文档)。您的响应已附加到soap命名空间中的父元素“Body”。

您需要从其父级分离响应,或者您需要克隆它并创建一个新实例.....在这种情况下,detach()是您的朋友:

response.detach();
System.out.println(new XMLOutputter().outputString(new Document(response)));

作为JDOM项目的维护者,我自然而然地建议您使用它,所以请以适当的偏差程度来接受它。

关于JDOM的介绍/教程,嗯,你是对的,它不是很棒,但是,the FAQ is useful,我在github wiki here上设置了一个'引子'。如果您对jdom-interest邮件列表有任何疑问,我会定期监控stackoverflow中的jdomjdom-2标记。