1

我正在尝试使用 DocumentBuilderFactory 解析 XML 文件,如下所示:

DocumentBuilderFactory ndsParserFactory = DocumentBuilderFactory.newInstance( );
ndsParserFactory.setNamespaceAware( true );
DocumentBuilder ndsParser = ndsParserFactory.newDocumentBuilder( );
Document ndsDocument = ndsParser.parse( ndsFileInputStream );

其中 ndsFileInputStream 是包装包含 XML 的文件的 InputStream。

当文件包含 Unicode 字符(例如 Δ)时出现异常。当我删除包含违规字符的行时,解析工作得很好。

该文件包含特征<?xml version="1.0" encoding="utf-8"?>标头。

我想知道我是否忽略了正确配置 DocumentBuilderFactory(或 DocumentBuilder)实例以处理 Δ 字符。

编辑(来自评论):

全面披露:这是 Android,我将 XML 文件(带有 NDS 文件扩展名)作为资产包含在我的 Android 应用程序中。我通过 AssetManager 访问它们,它有一个方便的方法可以将资产文件打开到 InputStream 中,然后我将其传递给 DocumentBuilder 的 parse 方法。– d 焊接 16 小时前

我注意到 assets 文件夹默认使用 CP1252 的编码作为其内容。所以我把它改成了UTF8。没运气。然后我从其中一个 NDS 文件(每个链接)中删除了 BOM 并再次尝试。没运气。我在想 APK 文件(像 ZIP 文件一样被压缩)以某种方式破坏了非 ASCII XML。我想我将不得不求助于通过其他方式将 NDS 文件放到 Android 设备上......

4

1 回答 1

-1

你确定文件真的写成 UTF-8 吗?显然,您可以在某个编辑器中打开它,它会正确显示文本,但它可能只是作为编码做出了很好的猜测。

要记住的另一件事是所有字符都是 UTF-8 中的 Unicode - 当解析器遇到在声明的编码中无效的字节序列时,它就会窒息。UTF-8 是一种非常宽容的编码,因为 7 位 ASCII 集中的任何字符都被编码为纯 ASCII,并且许多 XML 仅由纯 ASCII 字符组成。然后,当出现非 ASCII 的东西并且突然在通过系统的文本编码路径中的缺陷变得明显时,这会抓住人们。

您可以尝试编辑 XML 声明,看看它是否可以在另一种字符编码下解析;8859-7包含 Δ 符号 - 可以用它编码吗?

另外,有什么例外?

于 2012-05-21T21:27:37.270 回答