有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

将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) 个答案

  1. # 1 楼答案

    你确定这个文件是用UTF-8写的吗?显然,你可以在一些编辑器中打开它,它会正确地显示文本,但它可能只是在编码时进行了很好的猜测

    另一件需要记住的事情是所有字符在UTF-8中都是Unicode的-当解析器遇到在声明的编码中无效的字节序列时,它只是阻塞了。UTF-8是一种非常宽容的编码方式,因为7位ASCII集合中的任何字符都被编码为普通ASCII,而且很多XML只由普通ASCII字符组成。然后,当出现非ASCII的内容时,人们就会发现,通过系统的文本编码路径中的缺陷突然变得明显

    您可以尝试编辑XML声明,看看它在另一个字符编码下是否解析为ok8859-7包含Δ符号——它能被编码成那样吗

    还有,例外是什么