【发布时间】:2012-03-18 13:33:25
【问题描述】:
我在将文件写入 xml 时遇到问题。 这是该元素在 xsd 中的外观。
<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 的内容是有效的 base-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接口。 -
哇,谢谢。但是如何从流中写入?使用
writeCharacters(char[] text, int start, int len)??? -
是的。 XML 只能表示字符数据,所以如果你选择将 base64 编码的二进制数据写成字符数据,那么你应该自己编码。 Woodstox
writeBinary的东西是为了他们的高性能网络服务支持(例如快速信息集),所以除非你真的知道你在做什么,否则你应该避免它。 -
请看我的编辑。如何摆脱#xd;符号。