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

标签 java xml soap jdom-2

我有以下 XML,带有一个 soap 信封作为 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稍后,但首先我想摆脱 SOAP 信封。

如何使用 JDOM 2.0.5 删除 soap 信封并将剩余的 XML(即以 MyStartElement 作为根开始)作为 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 信封。

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

奖励问题:

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

最佳答案

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

你要么需要从它的父级分离响应,要么你需要克隆它并创建一个新实例......在这种情况下,detach() 是你的 friend :

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 标签。

关于java - 如何使用 JDOM 删除 SOAP 信封并将 XML 的其余部分作为字符串返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19769120/

相关文章:

java - 这个原型(prototype)类只会被Spring容器创建一次吗?

android - 从 xml 中定义的内容获取 textColor attr

c++ - 如何使用 libcurl C++ 从 url 保存 XML 文件

在元素名称和属性中使用多个命名空间的 C# XML 反序列化

java - 如何从 SOAP 响应中检索日期和时间?

angular - 使用 Angular 通过 HTTP 发送 SOAP 请求?

java - 如何通过名称调用 getter 方法?

java - 寻找不可约分数

java Drag and Drop - 列表不带参数

python - 解析包含相互引用的 XSD 的 WSDL