将XML文件解析为DOM时发生java错误
我尝试使用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,我在Android应用程序中包含XML文件(具有NDS文件扩展名)作为资产。我通过AssetManager访问它们,AssetManager提供了一种方便的方法,可以将资产文件打开到InputStream中,然后将其传递给DocumentBuilder的解析方法我16小时前就开始焊接了
我注意到assets文件夹的内容默认使用CP1252编码。所以我把它改成UTF8。不走运。然后,我从一个NDS文件(每个链接)中删除了BOM表并重试。不走运。我认为APK文件(像ZIP文件一样压缩)在某种程度上破坏了非ASCII XML。我想我将不得不求助于通过其他方式把NDS文件放到Android设备上
# 1 楼答案
你确定这个文件是用UTF-8写的吗?显然,你可以在一些编辑器中打开它,它会正确地显示文本,但它可能只是在编码时进行了很好的猜测
另一件需要记住的事情是所有字符在UTF-8中都是Unicode的-当解析器遇到在声明的编码中无效的字节序列时,它只是阻塞了。UTF-8是一种非常宽容的编码方式,因为7位ASCII集合中的任何字符都被编码为普通ASCII,而且很多XML只由普通ASCII字符组成。然后,当出现非ASCII的内容时,人们就会发现,通过系统的文本编码路径中的缺陷突然变得明显
您可以尝试编辑XML声明,看看它在另一个字符编码下是否解析为ok8859-7包含Δ符号——它能被编码成那样吗
还有,例外是什么