2012-03-18 33 views
1

ファイルをXMLに書き込む際に問題があります。 この要素がxsdでどのように見えるかを示します。ここでSTAXを使ってxmlにファイルを書き込む方法は?

<xs:element name="File"> 
     <xs:complexType> 
      <xs:simpleContent> 
       <xs:extension base="xs:base64Binary"> 
       </xs:extension> 
      </xs:simpleContent> 
     </xs:complexType> 
    </xs:element> 

書くための私の方法です:

 private void writeFile (XMLStreamWriter2 sw, final InputStream is){ 
//is - inputstream from file 
      try { 
       OutputStream output = null; 
       InputStream input = new Base64InputStream(is, true); 
       int count; 

        int BUFFER_SIZE = 4000; 
        byte[] buffer = new byte[BUFFER_SIZE]; 
        output = new FileOutputStream(new File("D:\\test.txt")); 
        while ((count = input.read(buffer)) != -1) { 

          output.write(buffer, 0, count); 
          sw.writeBinary(buffer, 0, count); 

        } 
        is.close(); 
        input.close(); 
        output.close(); 
      } catch (XMLStreamException ex) { 
       Logger.getLogger(StaxFinal.class.getName()).log(Level.SEVERE, null, ex); 
      } catch (IOException ex) { 
       Logger.getLogger(StaxFinal.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 

File XML要素ファイルの内容は、(私はhttp://www.opinionatedgeek.com/dotnet/tools/base64decode/をチェックしていないされている間のtest.txtの内容は、有効なベース64文字列です)。これを使用しようとすると、しかし、私は、キャリッジリターン記号#xd;

private void writeFile (XMLStreamWriter sw, InputStream is){ 
    //is - FileInputStream 
    Reader reader = new InputStreamReader(new Base64InputStream(is, true)); 
    char[] buf = new char[4096]; 
    int n; 

     while((n = reader.read(buf)) >= 0) { 
       sw.writeCharacters(buf, 0, n-3); 
     } 
} 

EDIT 方法の多くを取得する理由

EDIT

writeRaw(char[] chars, int i, int i1) 

が正常に動作します。奇妙ですが、woodstoxのreadElementAsBinaryは私のためにbase64を読み込んでデコードします。なぜwriteBinaryが有効なbase64を書いていないのですか?とにかく、スカフマンに感謝します。 あなたは素晴らしいです! Base64InputStreamのJavadocのに基づい

+1

は 'writeBinary'はWoodstox STAXの実装では、独自の方法であり、そのようにあなたが本当にそれを使用するべきではありません。標準の 'XMLStreamWriter'インターフェースに従います。 – skaffman

+0

うわー、ありがとう。しかし、ストリームから書き込む方法は? 'writeCharacters(char [] text、int start、int len)'を使って '??? – bunnyjesse112

+1

はい。 XMLは文字データのみを表すことができます。したがって、base64でエンコードされたバイナリデータを文字データとして書き込む場合は、自分でエンコードする必要があります。 Woodstoxの 'writeBinary'は高性能ウェブサービスのサポート(例えばFast Infoset)のためのものです。あなたがしていることを本当に知っていなければ、避けてください。 – skaffman

答えて

1

あるInputStreamを使用し、私はあなたは、Apache CommonsのコーデックからBase64InputStreamを使用すると仮定します。また、4つの引数を持つコンストラクタも用意されており、改行を完全に無効にすることができます。質問から、あなたの方法を調整 あなたは、このように、有効なBase64の出力を書き込むことができます。

private void writeFile (XMLStreamWriter sw, InputStream is){ 
    //is - FileInputStream 
    Reader reader = new InputStreamReader(new Base64InputStream(is, true, -1, null)); 
    char[] buf = new char[4096]; 
    int n; 
    while((n = reader.read(buf)) >= 0) { 
     sw.writeCharacters(buf, 0, n); 
    } 
} 
0

:あなたは(ブールdoEncode、で入力ストリーム)コンストラクタへの2つのパラメータを提供する場合、それはがBase64InputStreamを作成するすべてのデータを読み出すようにのいずれかであるBase64エンコードまたは提供元からBase64でデコードInputStream。doEncode - 私たちから読み込まれたすべてのデータをエンコードする必要がある場合はtrue、デコードする必要がある場合はfalseです。

私はあなたの関数が何をすべきかの確認していないので、私はこれだけを偵察することができます

  • をどちらかあなたは
  • falseにdoEncodeを回すことができる(あなたのxmlファイルにデコードされたテキストを保存するために)あるいは単にが直接(コピーする/ XMLへのテキストファイルを貼り付け)
+0

お返事ありがとうございます。 xml(xsd requirment)にエンコードされたテキストを格納する必要があります。私はなぜtest.txtがOKであるのか理解できませんが、XMLコンテンツはそうではありません。 – bunnyjesse112

+0

InputStream入力を変更する= new Base64InputStream(is、true); 〜InputStreamへの入力=です。 –

+0

が変更され、作成されたxml、コピーされたテキストがFile要素からコピーされ、そのオンラインデコーダに貼り付けられました。 '入力はBase以外の64文字、2文字以上のパディング文字、パディング文字の間に非空白文字を挿入します。 ' – bunnyjesse112

関連する問題