用sax读取XML时不能读取换行符号后面的内容的问题

来源:互联网 发布:显示自己是阿里云的ip 编辑:程序博客网 时间:2024/05/01 15:07

使用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中的内容就是一个标签中的完整字符串。

StringBuffer sb = new StringBuffer();
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
sb.delete(0,sb.length());
}
@Override
public void characters(char[] arg0, int arg1, int arg2) throws SAXException{
sb.append(arg0, arg1, arg2);
}
public void endElement(String s, String s1, String s2) throws SAXException {
//TODO 此时StringBuffer中的内容就是标签内的完整字符串。