我正在制作一个用于读取XML Internet的Android应用程序。此应用程序使用SAX解析XML。这是我解析部分的代码:
public LectorSAX(String url){
try{
SAXParserFactory spf=SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
DefaultHandler lxmlr=new LibraryXMLReader() ;
sp.parse(url, lxmlr);
nodo=((LibraryXMLReader)lxmlr).getNodoActual();
}catch(ParserConfigurationException e){
System.err.println("Error de parseo en LectorSAX.java: "+e);
}catch(SAXException e){
System.err.println("Error de sax LectorSAX.java: " + e);
} catch (IOException e){
System.err.println("Error de io LectorSAX.java: " + e);
}
}问题是发生了SAXException。异常消息如下:
org.apache.harmony.xml.ExpatParser$ParseException:第4行第42列:格式不正确(无效令牌)
但是,如果我将相同的代码放入正常的Java应用程序中,则不会出现此异常,并且一切正常。
为什么相同的代码在Java应用程序中工作得很好,而不是Android呢?另一方面,如何解决这个问题呢?
谢谢你的帮助。
欢迎光临。
发布于 2012-01-17 11:45:32
这可能是一个字符编码问题。
如您所见,无效的令牌错误指向第4行。
在这一条线上,你可以找到一个尖锐的(Meteorología)和一个倾斜的(Espa)。XML报头显示一个ISO-8859-15编码值。由于它不像UTFs或ISO-8859-1编码那样常见,所以当SAXParser连接并试图使用系统默认字符集将字节内容转换为字符时,可能会导致错误。
然后,您需要告诉SAXParser要使用哪个字符集。这样做的一种方法是向解析方法传递一个InputSource,而不是URL。例如:
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
InputSource is = new InputSource(url);
is.setEncoding("ISO-8859-15");
DefaultHandler lxmlr=new LibraryXMLReader() ;
sp.parse(is, lxmlr);编辑:,似乎Android不支持这种编码,引发了org.apache.harmony.xml.ExpatParser$ParseException: At line 1, column 0: unknown encoding异常。
由于ISO-8859-15主要兼容ISO-8859-1,除了一些特定字符(如您可以看到的这里)外,解决方法是在setEncoding方法中将ISO-8859-15值更改为ISO-8859-1,从而迫使解析器使用不同但兼容的字符集编码:
is.setEncoding("ISO-8859-1");看起来,由于Android不支持声明的字符集,它使用它的默认(UTF-8),因此解析器不能使用XML声明来选择apropiate编码。
https://stackoverflow.com/questions/8827006
复制相似问题