我有一個問題寫一個文件到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);
}
}
test.txt的含量是有效的基礎串64,而File
XML元素文件的內容是不是(我與http://www.opinionatedgeek.com/dotnet/tools/base64decode/檢查)。爲什麼
編輯 試圖利用這一點,但我得到了很多的回車符號#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);
}
}
編輯 方法:
writeRaw(char[] chars, int i, int i1)
工作正常。奇怪,但woodstox的readElementAsBinary
爲我讀取和解碼base64。爲什麼writeBinary
不寫有效的base64? 反正,謝謝你skaffman!你太棒了!
'writeBinary'是在Woodstox STAX執行專有的方法,因此,你應該沒有真正使用它。堅持標準的'XMLStreamWriter'界面。 – skaffman 2012-03-18 15:15:01
謝謝。但如何從流寫入?使用'writeCharacters(char []文本,int start,int len)'??? – bunnyjesse112 2012-03-18 15:35:29
是的。 XML只能表示字符數據,所以如果您選擇將base64編碼的二進制數據編寫爲字符數據,那麼您應該自己對其進行編碼。 Woodstox的'writeBinary'是爲了他們高性能的Web服務支持(例如Fast Infoset),所以你應該避免它,除非你真的知道你在做什麼。 – skaffman 2012-03-18 15:50:14