2

我发现这个 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 上运行相同的代码,它给了我以下错误:

[致命错误]:1:1:序言中不允许内容。线程“AWT-EventQueue-0”java.lang.IllegalArgumentException 中的异常:无法解析,很可能 XML 无效

引起:org.xml.sax.SAXParseException;行号:1;列号:1;序言中不能有内容。

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

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

谢谢,任何帮助表示赞赏。

4

1 回答 1

1

jcabiXMLDocument有各种构造函数,包括一个接受字符串的构造函数。所以一种方法是使用:

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(并且开头带有 BOM:对于littleFF FE -endian)。上述方法处理 BOM OK。

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

<?xml version="1.0"?>

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

我使用 Notepad++ 和十六进制编辑器来验证/选择编码并编辑测试文件。

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

于 2021-05-26T02:21:24.510 回答