【发布时间】:2016-03-17 20:19:28
【问题描述】:
我有一个用 UTF-16 LE 编码的超级简单的 XML 文档。
<?xml version="1.0" encoding="utf-16"?><X id="1" />
我正在加载它(使用jcabi-xml):
BOMInputStream bomIn = new BOMInputStream(Main.class.getResourceAsStream("resources/test.xml"), ByteOrderMark.UTF_16LE);
String firstNonBomCharacter = Character.toString((char)bomIn.read());
Reader reader = new InputStreamReader(bomIn, "UTF-16");
String xmlString = IOUtils.toString(reader);
xmlString = xmlString.trim();
xmlString = firstNonBomCharacter + xmlString;
bomIn.close();
reader.close();
final XML xml = new XMLDocument(xmlString);
我已通过保存文件并使用十六进制编辑器检查它来检查是否没有额外的 BOM/垃圾符号(前导或任何位置)。 XML 格式正确。
但是,我仍然收到以下错误:
[Fatal Error] :1:40: Content is not allowed in prolog.
Exception in thread "main" java.lang.IllegalArgumentException: Invalid XML: "<?xml version="1.0" encoding="utf-16"?><X id="1" />"
at com.jcabi.xml.DomParser.document(DomParser.java:115)
at com.jcabi.xml.XMLDocument.<init>(XMLDocument.java:155)
at Main.getTransformedString(Main.java:47)
at Main.main(Main.java:26)
Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 40; Content is not allowed in prolog.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
at com.jcabi.xml.DomParser.document(DomParser.java:105)
... 3 more
我已经在谷歌上搜索了这个错误,但他们都说这是 BOM 的错,我已经确认(据我所知)并非如此。还有什么问题?
【问题讨论】:
-
如果文件是 UTF-16 格式,那么 BOM 不应该保留文件的前两个字节吗?如果你添加另一个
bomIn.read();来丢弃第二个字节怎么办? -
实际上,既然我已经查看了
BOMInputStream的 JavaDocs,您应该完全删除bomIn.read()调用,因为流会为您丢弃 BOM。 -
@MickMnemonic 我也是这么想的,但是当我不打电话给
bomIn.read()时,我的字符串变成了由问号组成的东西。老实说,我不太确定如何使用BOMInputStream,但这个答案 (stackoverflow.com/questions/1835430/…) 写道,调用read会跳到第一个非 bom 字符(我忘记包含在我的示例代码中)。跨度> -
如果您正在使用 BOM,则应告知
InputStreamReader字节序:Reader reader = new InputStreamReader(bomIn, StandardCharsets.UTF_16LE); -
@MickMnemonic 现在无需致电
bomIn.read()即可完成工作,谢谢!然而,实际错误本身仍然存在。
标签: java xml xml-parsing