java - 将 XML 文件解析为 DOM 时出错

标签 java android xml parsing dom

我正在尝试使用 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"?> header 。

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

编辑(来自评论):

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

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

最佳答案

您确定该文件确实是用 UTF-8 编写的吗?显然,您可以在某些编辑器中打开它,它会正确显示文本,但它可能只是对编码进行了很好的猜测。

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

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

另外,什么是异常(exception)?

关于java - 将 XML 文件解析为 DOM 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10692693/

相关文章:

android - RecyclerView.Adapter 的 onCreateViewHolder 和 onBindViewHolder 方法没有被调用

xml - 在 openshift 中重新启动应用程序时找不到 web.xml 错误

java - ConcurrentHashMap 原子获取、增量和替换

android - 如何获取 1 个月的 GPRS 移动数据使用量?

java - 玩!使用 LDAP 的框架身份验证

android - 我的 Android 应用必须在市场上发布才能从 AdMob 赚取广告收入吗?

php - UPS 运输教程 (PHP)

xml - 在go中遍历xml

java - 使用 lingpipe 进行增量语言模型训练

Java MIDI 解析器?