3

我有以下带有肥皂信封的 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 删除肥皂信封并将剩余的 XML(即以MyStartElementroot 开头)作为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,包括肥皂信封。

我需要做什么才能使用 JDOM 从我的 XML 中剥离肥皂信封并获得String回报?

奖励问题:

  • JDOM 2 有很好的介绍/教程吗?(该网站似乎只有 JavaDocs,这使得入门有点困难......)
  • 我意识到使用 JDOM 可能有点过头了。关于如何以更简单的方式执行此操作的任何建议?
4

1 回答 1

2

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

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

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

作为 JDOM 项目的维护者,我很自然地会推荐您使用它,因此请以适当的偏见程度对待它。

至于 JDOM 的介绍/教程,嗯,你是对的,它不是很棒,但是,FAQ 很有用,我在这里的 github wiki上设置了一个“入门” 。如果您有任何问题,jdom-interest 邮件列表处于活动状态,我会定期在 stackoverflow 中监控jdomjdom-2标记。

于 2013-11-04T14:36:42.657 回答