Java 具有良好编码支持的内置XmlPullParser的替代方案

Java 具有良好编码支持的内置XmlPullParser的替代方案,java,android,xml,xmlpullparser,Java,Android,Xml,Xmlpullparser,我正在将一个为BlackBerry(Java)编写的项目移植到Android。该项目包含一些针对org.xmlpull.v1.XmlPullParser接口编写的xml解析类。实际的解析器实例从外部注入到这些类中 此应用程序解析以(也称为拉丁语9)编码的xml文件。我不能使用UTF-8,不幸的是我需要坚持这种编码 旧的BlackBerry项目使用pull解析器。现在在android中,我尝试使用内置的解析器,可以像这样获得: XmlPullParser parser = Xml.newPullP

我正在将一个为BlackBerry(Java)编写的项目移植到Android。该项目包含一些针对
org.xmlpull.v1.XmlPullParser
接口编写的xml解析类。实际的解析器实例从外部注入到这些类中

此应用程序解析以(也称为拉丁语9)编码的xml文件。我不能使用UTF-8,不幸的是我需要坚持这种编码

旧的BlackBerry项目使用pull解析器。现在在android中,我尝试使用内置的解析器,可以像这样获得:

XmlPullParser parser = Xml.newPullParser();
然后配置字符编码:

parser.setInput(<input stream>, "ISO-8859-15");
这真的很奇怪,因为我知道Android支持这种编码。证据是这条线毫无例外地运行:

String test  = new String("hi".getBytes(), "ISO-8859-15");
但是,如果我将解析器配置为不同的编码,如UTF-8或拉丁语-1,它就可以工作

接下来,我尝试在Android中使用旧项目的解析器(kxml2),但随后出现了新的错误:

org.xmlpull.v1.XmlPullParserException: unexpected type (position:END_DOCUMENT null@9:1 in java.io.InputStreamReader@43e97088)
即使我可以毫无问题地使用它,kxml2在过去几年中还没有得到支持(最后一个版本发布于2006年),所以如果可能的话,我想使用Android的pull解析器,它更健壮,也会有更好的性能

我可以愚弄调用
parser.setInput(bais,“ISO-8859-1”)的默认解析器
,因为这样它会忽略文件中XML声明中的编码,并且因为两个字符集具有相同的字符数,并且大多数字符集是相同的,所以它可以工作。但是这样的话,看源代码的人可能会认为它在实际接收拉丁语9的输入时使用了拉丁语1,因此产生了拉丁语9的字符串

默认XML拉式解析器不支持ISO-8859-15有什么原因吗?是否有其他具有良好字符编码支持的拉解析库

提前谢谢


更新:当我写这个问题时,我已经测试了OS2.2和2.3中的默认解析器。然而,在阅读
Xml.newPullParser
的javadoc时,我发现:

注意:这实际上比SAX解析器慢,并且没有完全实现。如果您需要一个快速的、主要实现的pull解析器,请使用这个。如果需要完整的实现,请使用KXML


事实上,在OS4.x中测试默认解析器时,我遇到了第二个异常。看起来OS4的内置解析器实际上是kxml

看来很难找到一个好的XmlPullParser库,所以我将按照javadocs中关于
Xml.newPullParser
factory方法的建议使用kxml的解析器。(我没有在在线javadocs中找到这个注释,只是在eclipse的javadoc窗口中。可能我使用的是旧的javadocs,而这个注释后来在Android开始使用kxml作为内置解析器后被删除)

至于使用kxml解析器时引发的异常,如下所示:

org.xmlpull.v1.XmlPullParserException: unexpected type (position:END_DOCUMENT null@9:1 in java.io.InputStreamReader@43e97088)
原来是我的代码造成的。在最初的端口中,我意识到Froyo和Gingerbread中包含的Android内置解析器在调用
parser.nextText
后并没有前进到下一个标记。因此,我在这里和那里添加了一些
parser.nexTag
行以使其工作。然后我再次切换到kXml,但我保留了那些额外的行,这使得我的KXmlParser实例在处理文件结尾时变得一团糟。到达文件末尾后调用
nextTag
时引发异常。这一点也在
nextTag
的文档中进行了解释:

调用next()并返回事件(如果它是START_标记或END_标记),否则抛出异常

org.xmlpull.v1.XmlPullParserException: unexpected type (position:END_DOCUMENT null@9:1 in java.io.InputStreamReader@43e97088)