ファイルを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のに基づい
は 'writeBinary'はWoodstox STAXの実装では、独自の方法であり、そのようにあなたが本当にそれを使用するべきではありません。標準の 'XMLStreamWriter'インターフェースに従います。 – skaffman
うわー、ありがとう。しかし、ストリームから書き込む方法は? 'writeCharacters(char [] text、int start、int len)'を使って '??? – bunnyjesse112
はい。 XMLは文字データのみを表すことができます。したがって、base64でエンコードされたバイナリデータを文字データとして書き込む場合は、自分でエンコードする必要があります。 Woodstoxの 'writeBinary'は高性能ウェブサービスのサポート(例えばFast Infoset)のためのものです。あなたがしていることを本当に知っていなければ、避けてください。 – skaffman