2012-03-18 62 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