使用SAX解析XML文档效率比较高,占用内存比较少,所以是Android中解析XML的首先方案。但使用SAX解析XML文档编写程序确不太方便,如果对SAX解析机制不太了解的话,很容易漏掉文本内容。
使用SAX解析XML主要用到的方法有以下3个:
public void startElement(String uri, String localName, String qName, Attributes attributes)
public void endElement(String s, String s1, String s2) throws SAXException
public void characters(char[] arg0, int arg1, int arg2)
从字面意思可以猜出他们的作用。startElement:SAX解析XML文档遇到一个标签时会调用该方法,endElement是当遇到一个标签结果时调用此方法,characters:当遇到一个标签之间的内容时调用此方法。
一般来说按照上面的描述,写一个Handler是很容易的。但有一个问题容易忽视。一个标签之间的字符比较多时,或者字符串中包含有”\n”等特殊字符时,就会出现字符丢失的现象。
<data>
<title>
Android用sax读取XML时
不能读取换行符号
后面的内容的问题
</title>
</data>
遇到这种问题不要怀疑SAX不能解析标签中含有”\n”或字符比较多的XML。实际上是我们写的Handler是有问题的。SAX在解析XML时,当遇到一个标签中的内容比较多时,就会多次调用characters。所以我们在写Handler时要考虑到这种情况。就不会丢字符了。以下是一种解决方案:建立一个StringBuffer.每次遇到一个标签开始时就清空这个StringBuffer。在每次调用characters时都将字符放到StringBuffer中。在endElement时,StringBuffer中的内容就是一个标签中的完整字符串。