我正在尝试使用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访问它们,它有一个方便的方法,用于将资产文件打开到InputStream中,然后我将其传递给我的DocumentBuilder的parse方法。 - d焊前16小时前
我注意到资产文件夹默认使用CP1252的编码作为其内容。所以我把它改成了UTF8。没运气。然后我从其中一个NDS文件(每个链接)中删除了BOM并再次尝试。没运气。我认为APK文件(像ZIP文件一样压缩)会以某种方式破坏非ASCII XML。我想我必须通过其他方式将NDS文件放到Android设备上......
答案 0 :(得分:0)
你确定文件真的写成了UTF-8吗?显然你可以在某个编辑器中打开它并正确显示文本,但它可能只是作为编码做出了很好的猜测。
要记住的另一件事是 all 这些字符是UTF-8中的Unicode - 解析器只是在遇到声明编码中无效的字节序列时才会窒息。 UTF-8是一种非常宽容的编码,因为7位ASCII集中的任何字符都被编码为就像纯ASCII一样,而且很多XML只由纯ASCII字符组成。然后当非ASCII出现时突然出现并突然显示系统中文本编码路径中的缺陷变得明显。
您可以尝试编辑XML声明,看看它是否在另一个字符编码下解析; 8859-7包含Δ符号 - 它可以编码吗?
另外,有什么例外?