我有以下带有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
后,我需要做些什么?
奖金问题:
答案 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中的jdom
和jdom-2
标记。