【问题标题】:JAXB chokes on UTF-16 XMLJAXB 阻塞 UTF-16 XML
【发布时间】:2021-07-29 01:39:13
【问题描述】:

我的项目使用 JAXB 从各种来源解析 XML。这适用于大多数来源,但我无法解析来自特定来源的文档。我能找到的唯一区别是违规文档报告其编码为 UTF-16,而据我所知,其他文档似乎是 UTF-8。

代码如下:

InputStream inputStream = new FileInputStream(inputFile);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(inputStream);

这会引发以下异常:

[Fatal Error] :1:40: Content is not allowed in prolog.
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 40; Content is not allowed in prolog.
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:257)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
    at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:121)
    at ... (my code)

违规文档以

开头
<?xml version="1.0" encoding="UTF-16"?>

直接跟在根元素的开始标签之后。我用十六进制编辑器检查了文件;在开始标记之前没有其他字符(甚至没有 BOM 或任何非打印字符)。

如果我将encoding 属性更改为UTF-8,代码会运行超过该点(尽管它会进一步抛出一个不相关的异常)。

JAXB 是否与 UTF-16 不兼容?或者还有什么问题?

【问题讨论】:

    标签: jaxb utf


    【解决方案1】:

    在文档上运行xmlstarlet fo 产生以下错误:

    /path/to/document.xml:1.38: Document labelled UTF-16 but has UTF-8 content
    

    总之,org.xml.sax.SAXParseException 带有错误消息 Prolog 中不允许内容 相当不具体,在某些情况下具有误导性

    虽然通常表示在根元素之前遇到了非法的额外字符(包括非打印字符),但它也可能表示完全不同的东西——例如 XML 序言指定的编码不匹配实际编码。

    【讨论】:

      猜你喜欢
      • 2011-01-07
      • 2015-09-19
      • 2017-06-27
      • 1970-01-01
      • 2018-07-30
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 2014-11-02
      相关资源
      最近更新 更多