使用Java在不同字符编码下编写XML

3
我正在尝试编写一个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的属性。

当我读取文件时,会出现错误:

"内容不允许在 prolog 中"

当编码属性手动更改为UTF-8时,此错误不会发生。

我正在尝试让上述代码编写一个以UTF-8编码的XML文档,或成功解析UTF-16文件。

解析的代码如下:

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

最后一行返回了错误。

如果您告诉我们XMLBuilder是什么,可能会有所帮助。在Google搜索“XMLBuilder”时,第一页的搜索结果显示(我认为)有7个不同的类! - Stephen C
哦,抱歉,XMLBuilder是一个自己创建的类,它接收一个SortedSet的Book(一种包装文件和元数据的类),并返回一个已构建的Document。这部分功能正常工作。 - romnempire
1个回答

2

LSSerializer的writeToString方法不允许Serializer选择编码。

使用LSOutput实例的setEncoding方法,可以更改编码并使用LSSerializer的write方法。可以将LSOutput CharacterStream设置为BufferedWriter的实例,这样从LSSerializer到write的调用将写入文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接