2012-03-18 63 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); 
      } 
     } 

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!你太棒了!

+1

'writeBinary'是在Woodstox STAX执行专有的方法,因此,你应该没有真正使用它。坚持标准的'XMLStreamWriter'界面。 – skaffman 2012-03-18 15:15:01

+0

谢谢。但如何从流写入?使用'writeCharacters(char []文本,int start,int len)'??? – bunnyjesse112 2012-03-18 15:35:29

+1

是的。 XML只能表示字符数据,所以如果您选择将base64编码的二进制数据编写为字符数据,那么您应该自己对其进行编码。 Woodstox的'writeBinary'是为了他们高性能的Web服务支持(例如Fast Infoset),所以你应该避免它,除非你真的知道你在做什么。 – skaffman 2012-03-18 15:50:14

回答

1

我假设你使用Apache的共享编解码器的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); 
    } 
} 
0

基于Base64InputStream的的Javadoc:如果提供两个参数来构造(InputStream的中,布尔doEncode),那么它创建Base64InputStream使得所有数据的读或者是Base64编码或从所提供的原始的Base64解码的InputStream。doEncode - 如果我们应该编码从我们读取的所有数据,则为true;如果我们应该解码,则为false。

因为我不知道你的函数应该做的事,我只能侦察这样的:

  • 或者你可以把doEncode为假(以解码文本存储在XML文件中)
  • 或者干脆使用的InputStream 是直接(复制/粘贴对XML文本文件)
+0

感谢您的回答。我需要将编码文本存储在xml(xsd requirment)中。我不明白为什么test.txt可以,而XML内容不是。 – bunnyjesse112 2012-03-18 14:15:20

+0

更改InputStream输入=新的Base64InputStream(是,true);到InputStream输入=是; – 2012-03-18 14:24:48

+0

已更改,打开已创建的xml,从File元素复制文本,粘贴到我链接的在线解码器中。'输入不是有效的Base-64字符串,因为它包含非基本64字符,两个以上填充字符或填充字符中的非空白字符。 ' – bunnyjesse112 2012-03-18 14:40:13