2

Play 1.2.4を使用していますが、サードパーティのWebサービスに電話する必要があります。応答を受け取ったとき、無効なXML形式が含まれているため、XPathを介して適切に解析できません。

応答には&gt;、と&lt;の代わりに<とがあり>ます。運が悪かったので、応答をデコードしようとしました。「application/soap+xml」と思われる応答内容も確認しました。

では、どうすればこの文字を置き換えることができますか。正規表現を使用した単純な文字列置換関数以外に、これを置換/変換するエレガントな方法はありますか?

編集:ここでより良いアイデアを得るには、Webサービスを呼び出す方法があります。

HttpResponse response = WS.url(WS_URL)
                 .setHeader("Content-Type","application/soap+xml") 
                 .body(wsBody)
                 .post();

これが私が解析するために行うことです:

org.w3.dom.Document xmlDoc = response.getXML();
String textOfSelectedTag = XPath.selectText("tag", xmlDoc);

<tag>XPathは、次のような形式ではないため、タグを見つけることができません。&lt;tag&gt;

4

2 に答える 2

2

さて、これは文字列を返す単なるSOAPメソッドのように見えます-そして文字列はたまたまXMLです。

したがって、<GetFooResult>(またはその他の)タグの内容を文字列として取得し、それをXMLドキュメントとして解析する必要があります。文字列として取得すると、&lt;to<などがデコードされているため、有効なドキュメントになります。次に、ルート要素を含むドキュメントが作成され、そのルート要素をTAG1クエリできます。

ただし、Webサービスライブラリを使用して呼び出しを行うことをお勧めします。すべてを抽象化できるため、呼び出しgetFoo()などで結果の文字列を取得し、期待どおりに解析できます。

于 2013-01-11T15:34:57.593 に答える
1

あなたのXMLには良いルート要素があると思います!それ以外の場合xmlDoc = response.getXML();はエラーが発生するはずです!XMLには、このように表示される要素がほとんどないか、多いと思います。私が間違っていなければ、そのようなファイルの作成を担当するのはWebサービス上のXMLビルダーです!それはあなたがそれを読んでいる方法のためではありません!

そのような場合、私たちは私たちの側で何もすることができません!私は、仲間のメンバーが不適切にエンコードされたXMLに遭遇したようなシナリオに出くわしました。そのような場合に私が提案しているのは、そのようなXMLを生成しているコードを変更することです(アクセスできる場合)。そうでない場合は、正規表現または文字列操作だけが残ります。これは好ましくありませんが、利用可能な方法のみです。

私が見たそのようなXMLコードの理由の1つは、文字列の連結を使用しているためです。したがって、私の最初の提案は、XMLを生成しているソースコードを変更することです。

&lt;to<および&gt;toを置き換えるための正規表現パターン>

string result = Regex.Replace(Regex.Replace(input, @"(\&lt;)", @"<"), @"(\&gt;)", @">");
于 2013-01-11T13:27:03.073 に答える