用sax读取XML时不能读取换行符号后面的内容的问题
2011-09-20 20:15
239 查看
使用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中的内容就是标签内的完整字符串。
使用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中的内容就是标签内的完整字符串。
相关文章推荐
- java中org.xml.sax不能读取xml回车换行的问题解决(android)
- 问题:org.xml.sax.SAXParseException: prolog 中不允许有内容
- Dom4j SAXReader读取xml异常时占用文件,导致不能移动文件
- fckeditor部署到weblogic出现xml无法读取及样式不能显示问题的解决方法
- 用stream.Read不能完整读取内容的问题。
- Hibernate4.1不能读取XML的问题
- 防微博内容展示,使用Html.fromHtml(),解决内容不能换行的问题
- XML解析之sax解析案例(一)读取contact.xml文件,完整输出文档内容
- android 实用sax 读取xml文件内容
- OfficeOpenXml读取Excel单元格内容,受到样式干扰的问题(富文本)
- fckeditor部署到weblogic的xml无法读取,样式不能显示问题
- XML解析之sax解析案例(一)读取contact.xml文件,完整输出文档内容
- cocos2d-x 读取xml中的“\n”不能换行
- android 实用sax 读取xml文件内容 附源码
- 解决Excel 2007的"有 XML 错误的 /xl/sharedStrings.xml"问题 (“发现不可读取的内容,是否回复此工作薄的内容...")
- cocos2d-x 读取xml中的“\n”不能换行
- SAX 读取xml时character()的问题
- 从数据库读取带有HTML或者XML内容的问题时
- 在c#中将dataset输出成xml内容的xls文件,解决其它输出不能在excel中显示“001”的前导0的问题
- c#.net不能完全读取Excel内容的问题