1

ドキュメント内の単一の名前空間宣言の二重引用符を単一引用符に変更し、他のすべての名前空間宣言を二重引用符のままにしたいと考えています。これどうやってするの?

サーバーからの応答ドキュメントは次のとおりです。

<?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><InquiryResponse xmlns="http://www.openuri.org/"><Header><HeaderAttr1>abcd</HeaderAttr1><HeaderAttr2>xxx</HeaderAttr2><HeaderAttr3>string</HeaderAttr3></Header><Body><InquiryResult><ResultItem1>theresulttext</ResultItem1><ResultItem2>abcd</ResultItem2><ResultItem3>0</ResultItem3></InquiryResult></Body></InquiryResponse></soapenv:Body></soapenv:Envelope>

( open:InquiryResponse には ' not " があることに注意してください) のようなものが必要です。

<?xml version="1.0" encoding="utf-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body> <open:InquiryResponse xmlns:open='http://www.openuri.org/'><open:Header><open:HeaderAttr1>abcd</open:HeaderAttr1><open:HeaderAttr2>xxx</open:HeaderAttr2><open:HeaderAttr3>string</open:HeaderAttr3></open:Header><open:Body><open:InquiryResult><open:ResultItem1>theresulttext</open:ResultItem1><open:ResultItem2>abcd</open:ResultItem2><open:ResultItem3>0</open:ResultItem3></open:InquiryResult></open:Body></open:InquiryResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>

名前空間プレフィックスの変更、追加の名前空間宣言、空白の修正、文字セットの変更を行うことができました。必要なのは、これらの 2 バイトを変更することだけです。

Spring WS + Woodstox + Axiom を使用して、単純な照会 Web サービスを構築しています。これは既存のサービスの代替であり、バイトごとに同一にしたいと考えています ($$ の理由)。XML を同一の型にすることはできますが、この時点では、データを検索するためにどのコンシューマーが grep または regex を使用しているかはわかりません。

これまでのところ、XSLT と PayloadTransformingInterceptor を使用してこの問題に対処しようとしています。他のオプションにも興味があります。

4

3 に答える 3

1

コメントはほぼ正しいです。このような精度で低レベルを構成するための「クリーンな」プログラムによる解決策はありません。もろさを考えると、テキストマングリングを使用するのが最善です。これがテストなどの目的である場合、ほとんどの場合、正規表現で十分に機能します。

于 2012-09-21T21:16:37.100 に答える
0

解決策は、Spring-WS をドロップし、代わりに CXF に移行することでした。CXF では、処理のどの段階でもインターセプターが許可されるため、メッセージ ストリームのバイトに完全にアクセスできます。醜いが、働いている。PRE_STREAM で OutputStream をフックするインターセプターを構築し、PRE_STREAM_ENDING で修正を行うと、SOAP エンベロープを完全に制御できます。

ご回答ありがとうございます。それはひどいですが、うまく機能し、適切に行う時間があれば、かなり簡単に切断できます (!!)。

于 2012-09-29T11:04:06.240 に答える
0

あなたの質問と例を数回読み直した後、私は問題を理解していると思います:)

PayloadTransformingInterceptorを確認する必要があると思います。そのインターセプターで受信メッセージと送信メッセージを変換できます。そのインターセプターの典型的な使用法は、古いバージョンの wsdl を新しいバージョンに変換してサポートすることです。このインターセプターは両方の方法で機能します-あなたの場合は発信のみです。

XSLT を使用してこれを修正できるかどうかはわかりません。そうでない場合は、独自の Interceptor を作成して、必要な特定の文字列置換機能を提供できます。

于 2012-09-28T12:41:40.730 に答える