将XML文件解析为DOM时出错

时间:2012-05-21 21:13:01

标签: 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"?>标题。

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

修改(来自评论):

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

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

1 个答案:

答案 0 :(得分:0)

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

要记住的另一件事是 all 这些字符是UTF-8中的Unicode - 解析器只是在遇到声明编码中无效的字节序列时才会窒息。 UTF-8是一种非常宽容的编码,因为7位ASCII集中的任何字符都被编码为就像纯ASCII一样,而且很多XML只由纯ASCII字符组成。然后当非ASCII出现时突然出现并突然显示系统中文本编码路径中的缺陷变得明显。

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

另外,有什么例外?