2010-05-29 55 views
3

我正在嘗試編寫一個可以再次讀入我的程序的XML庫文件。用Java以不同的字符編碼編寫XML

文件寫入器代碼如下:

XMLBuilder builder = new XMLBuilder(); 
Document doc = builder.build(bookList); 
DOMImplementation impl = doc.getImplementation(); 
DOMImplementationLS implLS = (DOMImplementationLS) impl.getFeature("LS", "3.0"); 
LSSerializer ser = implLS.createLSSerializer(); 
String out = ser.writeToString(doc); 

//System.out.println(out); 

try{ 
    FileWriter fstream = new FileWriter(location); 
    BufferedWriter outwrite = new BufferedWriter(fstream); 
    outwrite.write(out); 
    outwrite.close(); 
}catch (Exception e){ 
} 

上面的代碼不寫的XML文檔。

但是,在XML標頭中,它是文件以UTF-16編碼的屬性。

當我在該文件中讀出,我得到的錯誤:

「的內容不允許在序言」

當編碼屬性被手動更改爲UTF-8不會發生此錯誤。

我想獲得上述代碼來編寫以UTF-8編碼的XML文檔,或成功解析UTF-16文件。

解析的代碼是

DocumentBuilderFactory factory = 
DocumentBuilderFactory.newInstance(); 
DocumentBuilder loader = factory.newDocumentBuilder(); 
Document document = loader.parse(filename); 

最後一行將返回錯誤。

+0

如果您告訴我們XMLBuilder是什麼,它可能會有所幫助。在搜索結果的第一頁顯示(我認爲)7個不同的類...搜索結果的第一頁中搜索「XMLBuilder」 – 2010-05-29 04:40:33

+0

哦,對不起,XMLBuilder是一個自創類,它接受Book的SortedSet(文件和元數據的包裝類)並返回一個構建的Document。這部分工作正常。 – romnempire 2010-05-29 06:29:23

回答

2

LSSerializer writeToString方法不允許序列化程序選擇編碼。

用LSOutput實例的setEncoding方法,LSSerializer的寫方法可以用來改變編碼。可以將LSOutput CharacterStream設置爲BufferedWriter的一個實例,以便來自LSSerializer進行寫入的調用將寫入該文件。