我已经找到了这个JCabi代码片段,它可以很好地处理UTF-8XML编码文件,它基本上读取该xml文件,然后将其打印为一个字符串。
XML xml;
try {
xml = new XMLDocument(new File("test8.xml"));
String xmlString = xml.toString();
System.out.println(xmlString);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}但是,为了在UTF-16编码的xml上运行相同的代码,我需要这样做,它给出了以下错误:
致命错误:1:1: prolog中不允许内容。线程“AWT 0”java.lang.IllegalArgumentException中的异常:无法解析,很可能是由:org.xml.sax.SAXParseException、lineNumber: 1、columnNumber: 1造成的,在prolog中不允许使用内容。
我读过关于这个错误的文章,这意味着解析器它没有识别prolog,因为它看到的字符因为编码而不应该在那里。
我尝试过其他库,它们提供了一种“告诉”编码源文件的类的方法,但是我能够在某种程度上让它工作的唯一库是JCabi,但是我无法找到一种方法来告诉它我的源文件是用UTF-16编码的。
谢谢,任何帮助都是非常感谢的。
发布于 2021-05-26 02:21:24
jcabi XMLDocument有各种构造函数,包括一个接受字符串的构造函数。因此,一种方法是使用:
Path path = Paths.get("test16_LE_with_bom.xml");
XML xml = new XMLDocument(Files.readString(path, StandardCharsets.UTF_16LE));
String xmlString = xml.toString();
System.out.println(xmlString);这利用了java.nio.charset.StandardCharsets和java.nio.file.Files。
在我的第一个测试中,我的XML文件被编码为UTF-16-LE (开头是一个BOM表:FF FE表示小endian)。以上方法处理BOM OK。
我的测试文件的prolog如下(没有显式编码--也许这是一件坏事,在这里?):
<?xml version="1.0"?>在我的第二个测试中,我删除了BOM,并使用更新的文件重新运行--这也有效。
我使用Notepad++和十六进制编辑器来验证/选择编码&编辑测试文件。
您的文件可能与我的测试文件不同(bevs.le)。
https://stackoverflow.com/questions/67697036
复制相似问题