3

Java として soap エンベロープを含む次の XML があります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 エンベロープを削除し、残りの 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)));

しかし、soap エンベロープを含む XML 全体が返されました。

JDOM を使用して XML から SOAP エンベロープを取り除き、元にString戻すにはどうすればよいですか?

おまけの質問:

  • JDOM 2 の適切な紹介/チュートリアルはありますか? (Web サイトには JavaDocs しかないようで、開始するのが少し難しくなっています...)
  • 私は、JDOM を使用することは、おそらくこれについては少しやり過ぎであることを理解しています。これをより簡単な方法で行う方法に関する提案はありますか?
4

1 に答える 1

2

JDOM コンテンツは、一度に 1 つの親 (要素/ドキュメント) にのみ添付できます。応答は、soap 名前空間の親要素 'Body' に既に添付されています。

親から応答を切り離すか、クローンを作成して新しいインスタンスを作成する必要があります.....この場合、detach()あなたの友人は次のとおりです。

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

JDOM プロジェクトの管理者として、JDOM プロジェクトを使用することをお勧めするのは自然なことです。そのため、適切なレベルの偏見を持って使用してください。

JDOM の紹介/チュートリアルについては、その通りです。素晴らしいものではありませんが、FAQ は役に立ちます。ここで github wikiに「入門書」を用意しました。ご不明な点がございましたら、jdom-interest メーリング リストがアクティブです。私は定期的にスタックオーバーフローのjdomjdom-2タグを監視しています。

于 2013-11-04T14:36:42.657 に答える