2009-04-01 10 views
2

私は1つのパラメータ、XML形式のStringでWebサービスを呼び出す必要があります。 私はこれをXSLT変換で構築しています。ここまでは順調ですね。WebサービスのためのXML:インラインアタッチ

<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へ:

問題は、このXSDフラグメントである

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

はい、あなたは右のそれを得た:私は、ファイルの内容を挿入する必要がありますベース64バイナリ形式のXML文書に変換します。

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

どうすればよいですか?

:私は添付ファイルでSOAPを使用することはできません、と私は前述のアプローチは、巨大な添付ファイルの場合には故障しやすいであることをよく認識してんだけど、現時点では、私たちの相手はびくともしません。

+0

なぜhtmlファイルを使用していないのですか?コンテンツをプログラマチックに配置してください。 –

+0

ここで何を示唆しているのか分かりません...詳細を教えてください。 –

答えて

2

これを行う最も良い方法は、ファイルを読み込んで、その内容をXSLT変換をインスタンス化するコードによってbase64でエンコードすることです。 base64文字列は、変換のパラメータとして渡すことも、変換によって拡張メソッドを介して要求することもできます。原則XSLTで

しかし、いくつかのバイト(XML 1.0およびXML 1.1)0などの値、および(XML 1.0)の0x20以下29の他のコードは次のように禁止されている、BASE64に符号化を行うために使用することができますXSLTでのエンコーディングが不可能になります。

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

0

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

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

これは、XSLTでこれをフックすることです。おそらくもっと簡単な方法は、クライアントAPIのSoapスタック(CXF、別名XFireなど)がXMLStreamReader/Writer経由でコンテンツにアクセスできるかどうかを調べることです。ほとんどの新しいものはStaxに基づいており、通常はWoodstoxを埋め込みます。

1

SOAPスタックがMTOMをサポートしている場合は、オンにします。次にそれは、データ要素が配置されるMIME添付ファイルへの "参照"をコンテンツ要素に入れます。そのデータは完全にバイナリで、base64でエンコードされていない可能性があります。

0

Javaのbase64Binaryオブジェクト(ハードコードされたデータパスに記載されているように)のために少なくともテスト目的でデータを送信する方法は次のとおりです。

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

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

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

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

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

関連する問題