java - 如何使用STAX将文件写入 xml?

  显示原文与译文双语对照的内容

我在将文件写入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 你真棒 !

时间: 作者:

我假设你使用的是来自 Apache Commons编解码器的Base64InputStream 。 它还提供一个带有四个参数的构造函数,可以用来完全关闭行中断。 根据你的问题调整方法,你可以编写有效的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);
 }
}

基于Base64InputStream的javadoc: 如果向构造函数提供两个参数,那么它将创建一个 Base64InputStream,以便所有数据读取都是由原始提供的InputStream中的Base64-encoded或者 Base64-decoded read 。 如果我们应该编码所有从我们读取的数据,那么和 doEncode true,如果我们应该解码。

因为我不确定你的功能应该做什么,所以我只能对它的进行侦察:

  • 可以将doEncode转换为 false ( 在xml文件中存储解码文本)
  • 直接使用 inputstream ( 将文本文件复制/粘贴到 xml )
...