使用 JCabi Java 读取 UTF-16 XML 文件

Reading UTF-16 XML files with JCabi Java

我发现这个 JCabi 片段代码适用于 UTF-8 xml 编码文件,它基本上读取 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 它给了我以下错误:

[Fatal Error] :1:1: Content is not allowed in prolog. Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Can't parse, most probably the XML is invalid

Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.

我已阅读有关此错误的信息,这意味着解析器无法识别序言,因为它看到了因编码而不应存在的字符。

我已经尝试过其他库提供了一种方法来“告诉”class 源文件编码在哪个编码中,但我能够在某种程度上让它工作的唯一库是 JCabi , 但我无法找到一种方法来告诉它我的源文件是用 UTF-16 编码的。

谢谢,如有任何帮助,我们将不胜感激。

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.StandardCharsetsjava.nio.file.Files

在我的第一次测试中,我的 XML 文件被编码为 UTF-16-LE(并且开头有一个 BOMFF FE 表示小端)。上述方法处理 BOM OK。

我的测试文件的序言如下(没有显式编码 - 也许这是一件坏事,在这里?):

<?xml version="1.0"?>

在我的第二次测试中,我删除了 BOM 并使用更新后的文件重新运行 - 这也有效。

我使用 Notepad++ 和十六进制编辑器来 verify/select 编码和编辑测试文件。

您的文件可能与我的测试文件不同(BE 与 LE)。