2

XML形式の文字列という単一のパラメーターを使用してWebサービスを呼び出す必要があります。XSLT変換を介してこれを構築しています。ここまでは順調ですね。

問題はこのXSDフラグメントにあります:

<xs:complexType name="Document">
    <xs:sequence>
        <xs:element name="title" type="xs:string" minOccurs="1"/>
        <xs:element name="content" type="xs:base64Binary" minOccurs="1"/>
    </xs:sequence>
</xs:complexType>

これは(たとえば)このXMLに変換されます:

<attachment>
    <title>test title</title>
    <content>          
    PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Inllc
    yI/Pg0KPG1zZ3ByYXRpY2E+DQogICAgPHByYXRpY2E+DQogICAgICAgIDxwcm9jZXNzbz
    4NCiAgICAgICAgICAgIDxjb2RQcm9jZXNzbz4xPC9jb2RQcm9jZXNzbz4NCiAgICAgICA
    gICAgIDxjb2RJc3RhbnphUHJvY2Vzc28MzwvY29kSXN0YW56YVByb2Nlc3NvPg0KICAgI
    CAgICAgICAgPGNvZFN0YXRvPjYwPC9jb2RTdGF0bz4NCiAgICAgICAgPC9wcm9jZXNzbz
    4NCiAgICA8L3ByYXRpY2E+DQo8L21zZ3ByYXRpY2E+
    </content>
</attachment>

はい、正解です。ファイルの内容をBase64バイナリ形式でXMLドキュメントに挿入する必要があります。

XSLTでプレースホルダーを挿入し、XMLドキュメントを処理して実際のファイルコンテンツに置き換えることを考えましたが、これらの機会にベストプラクティスがあるかどうか疑問に思っています。おそらく、私の知識やJavaをはるかに超えた素晴らしいXSTLトリックです。便利なツール。

どのようにそれをしますか?

添付ファイル付きのSOAPは使用できません。また、前述のアプローチは、添付ファイルが大きい場合に失敗する可能性があることを十分に認識していますが、現時点では、対応するものは動揺しません。

4

4 に答える 4

2

おそらくこれを行う最善の方法は、ファイルを読み取り、XSLT 変換をインスタンス化するコードによってその内容を base64 でエンコードすることです。base64 文字列は、パラメーターとして変換に渡すか、変換で拡張メソッドを介して要求することができます。

原則として、XSLT を使用して base64 へのエンコードを行うことができますが、0 (XML 1.0 および XML 1.1 の場合) などの一部のバイト値や、0x20 未満の他のコード (XML 1.0 の場合) は、XML ドキュメント内の文字として禁止されています。これにより、XSLT でのそのようなエンコードは不可能になります。

(参照: http://projects.ischool.washington.edu/tabrooks/545/ContentManagement/PassingParameters.htm )

于 2009-04-01T22:38:03.830 に答える
0

これはまさにあなたが探している答えではありませんが、WoodstoxリンクテキストのようなXMLプロセッサは、インラインBase64でエンコードされたコンテンツの効率的な読み取りと書き込みをサポートします。Woodstox 4.0では、Stax2拡張APIの一部であるいわゆるTyped Access API(パッケージ "org.codehaus.stax2.typed。*"、TypedXMLStreamReader、TypedXMLStreamWriterの下)を使用して実行されます。

これにより、バイナリデータが与えられた場合に、要素と属性の値のストリーミング読み取り/書き込みが可能になります。

その場合の秘訣は、これをXSLTに接続することです。もう1つのおそらくより簡単な方法は、クライアントAPIのSoapスタック(CXF、別名XFireなど)がXMLStreamReader/Writerを介してコンテンツにアクセスできるかどうかを判断することです。ほとんどの新しいものはStaxに基づいており、通常はWoodstoxが埋め込まれています。

于 2009-04-02T18:22:05.723 に答える
0

これは、少なくともテスト目的で(ハードコードされたデータパスで示されているように)Javaでbase64Binaryオブジェクト(MTOMまたはSwArefを使用)でデータを送信する方法です。

obj.setContent(
  new DataHandler(
    新しいURLDataSource(
      this.getClass()。getResource( "/ someDocument.png")
    ));

通常の操作では、FileDataSourceを使用してデータを渡します。誰かがあなた自身のデータソースを作成するという考えを持っているだろうと私はかなり確信していますが。一般的に、これは悪い考えだと思います。最も可能性の高い実装は、VMメモリを使用するByteArrayInputStreamを使用することであり、大きなファイルを送信する場合はひどく爆発するからです。

テスト目的で単純な文字列を渡す必要がある場合は、次のようにすることができます。

obj.setContent(
  new DataHandler( "test string"、 "text / plain");

また、WebSphere 7ランタイムを使用して@MTOMいる場合、送信されるデータにメッセージのみが含まれ、添付ファイルが含まれていないことに気付いた場合は、サービス実装でアノテーションを使用する必要があります。

于 2010-09-27T18:44:41.287 に答える