2012-01-11 53 views
5

我正在制作一个读取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: At line 4, column 42: not well-formed (invalid token)

但是,如果我把相同的代码在一个正常的Java SE应用程序,此异常不会发生,一切工作正常。

为什么相同的代码在Java SE应用程序中工作正常,而不是Android ?.另一方面,如何解决这个问题呢?

感谢您的帮助。

问候。

+0

可以分享你的xml ...并根据错误有一个问题与你的xml .. – 2012-01-12 05:08:34

+0

@MohitSharma但是,为什么相同的代码在Java SE应用程序,而不是Android的工作正常。这是网址:http://www.aemet.es/xml/municipios/localidad_33002.xml – Lobo 2012-01-12 09:21:52

+0

原来我认为有一些问题与您的XML错误..但它不是那样的......现在唯一的解决方案与你是你有调试解析 – 2012-01-12 09:55:12

回答

11

这可能是一个字符编码问题。
如您所见,无效标记错误指向第4行。
在这条线,你可以找到一种急性(Meteorología)和波浪号(西班牙)。 XML标头显示编码值为ISO-8859-15。由于它不如UTF或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兼容,除了一些特殊字符(如你所看到的here),一个解决办法是在setEncoding方法改变ISO-8859-15ISO-8859-1,迫使解析器使用不同但兼容的字符集编码:

is.setEncoding("ISO-8859-1"); 

,因为它似乎,由于Android不支持声明的字符集,它使用其默认(UTF-8),因此解析器不能使用XML声明选择apropiate编码。

+1

Hi @ tomas-narros,谢谢,我会尽力而且你会注意到结果。 – Lobo 2012-01-17 12:14:44

+3

解析器不应该谨慎使用XML声明来选择适当的编码吗? – 2012-01-17 12:24:23

+1

这是个好点@JB。当然应该。但我很确定这是一个编码问题。 – 2012-01-17 13:38:11