免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1243 | 回复: 0
打印 上一主题 下一主题

Android 解析XML文件(sax) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-21 08:41 |只看该作者 |倒序浏览
android系统支持使用SAX、DOM或者pull读取xml文件(建议不要使用DOM解析-它比较耗内存)

SAX是一个解析速度快并且占用内存少的xml解析器。它解析的时候采用事件驱动。
即它不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法的XML语法的某部分,
如果符合,则会调用某个回调方法——这些方法定义在ContentHandle接口中。

startDocument()
当遇到文档的开头的时候,调用该方法,可以做一些预处理的工作

endDocument()
当文档结束的时候,调用该方法,可以做一些善后工作

startElement(String namespaceURI,String localName,String qName,Attributes attr)
当读到一个开始标签的时候,会触发这个方法
参数分别为:命名空间、不带命名空间的标签名、带命名空间的标签名、得到的所有属性名和相应的值

endElement(String uri,String localName,String name)
在遇到结束标签的时候,调用该方法

characters(char[] ch,int start,int length)
这个方法来处理在xml文件中读到的内容,第一个参数用于存放文件的内容,后面的两个参数是读到的字符串
在这个数组中的起始位置和长度,使用new String(ch,start,length)就可以获取内容

如有以下xml文件
<?xml version="1.0" encoding="UTF-8"?> 
<persons>
<person id="10">
<name>LiMing</name>
<age>30</age>
</person>
<person id="20">
<name>XiaoZhang</name>
<age>25</age>
</person>
</persons>

解析过程触发的事件为:
读到的标签及内容 触发事件
{文档开始} startDocument()
<persons> startElement("","persons",null,"{Attributes}")
"\n\t" characters("<persons>...</persons>","12","2")
<person> startElement("","person",null,"{Attributes}")
"\n\t\t" characters("<persons>...</persons>","31","3")
<name> startElement("","name",null,"{Attributes}")
"LiMing" characters("<persons>...</persons>","40","2")
</name> endElement("","name",null)
"\n\t\t" characters("<persons>...</persons>","50","3")
<age> startElement("","age",null,"{Attributes}")
"30" characters("<persons>...</persons>","58","2")
</age> endElement("","age",null)
"\n\t" characters("<persons>...</persons>","67","2")
</person> endElement("","person",null)
"\n\t" characters("<persons>...</persons>","79","2")
<person> startElement("","person",null,"{Attributes}")
"\n\t\t" characters("<persons>...</persons>","98","3")
<name> startElement("","name",null,"{Attributes}")
"XiaoZhang" characters("<persons>...</persons>","107","3")
</name> endElement("","name",null)
"\n\t\t" characters("<persons>...</persons>","118","3")
<age> startElement("","age",null,"{Attributes}")
"25" characters("<persons>...</persons>","126","2")
</age> endElement("","age",null)
"\n\t\t" characters("<persons>...</persons>","135","2")
</person> endElement("","person",null)
"\n" characters("<persons>...</persons>","147","1")
</persons> endElement

写了一个sax解析程序,来解析该xml文件
  1. import org.xml.sax.Attributes;
  2. import org.xml.sax.SAXException;
  3. import org.xml.sax.helpers.DefaultHandler;

  4. public class StudentInfoContentHandler2 extends DefaultHandler {

  5.     @Override
  6.     public void characters(char[] ch, int start, int length) throws SAXException {
  7.         if(person!=null) {
  8.             String data = new String(ch, start, length);
  9.             if("name".equals(tagName)) {
  10.                 person.name = data;
  11.             } else if("age".equals(tagName)) {
  12.                 person.age = Integer.valueOf(data);
  13.             }
  14.         }
  15.     }

  16.     @Override
  17.     public void endDocument() throws SAXException {
  18.         for(Person p : personList) {
  19.             System.out.println(p);
  20.         }
  21.     }

  22.     @Override
  23.     public void endElement(String uri, String localName, String qName) throws SAXException {        
  24.         if("person".equals(qName)) {
  25.             personList.add(person);
  26.             person = null;            
  27.         }
  28.         tagName = null;
  29.     }

  30.     @Override
  31.     public void startDocument() throws SAXException {
  32.         personList = new ArrayList<Person>();
  33.     }

  34.     @Override
  35.     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
  36.         if("person".equals(qName)) {                    
  37.             person = new Person();
  38.             person.id = Integer.valueOf(attributes.getValue("id"));
  39.         } else {
  40.             
  41.         }
  42.         tagName = qName;
  43.     }
  44.     
  45.     List<Person> personList;
  46.     Person person;
  47.     String tagName;
  48. }


  49. class Person
  50. {
  51.     @Override
  52.     public String toString() {
  53.         return "id=" + id + " name=" + name + " age=" + age;
  54.     }
  55.     public int id;
  56.     public String name;
  57.     public int age;
  58.     
  59. }

写了一个测试程序,来测试解析过程是否正确:
  1. import java.io.File;
  2. import java.io.IOException;

  3. import javax.xml.parsers.ParserConfigurationException;
  4. import javax.xml.parsers.SAXParser;
  5. import javax.xml.parsers.SAXParserFactory;

  6. import org.xml.sax.SAXException;


  7. public class SAX_XML_Parser {

  8.     public static void main(String[] args) {        
  9.         try {
  10.             readXml();
  11.         } catch (ParserConfigurationException e) {
  12.             // TODO Auto-generated catch block
  13.             e.printStackTrace();
  14.         } catch (SAXException e) {
  15.             // TODO Auto-generated catch block
  16.             e.printStackTrace();
  17.         } catch (IOException e) {
  18.             // TODO Auto-generated catch block
  19.             e.printStackTrace();
  20.         }
  21.     }

  22.     private static void readXml() throws ParserConfigurationException, SAXException, IOException {
  23.         File file = new File("C:/studentInfo.xml");
  24.         SAXParserFactory spf = SAXParserFactory.newInstance();
  25.         SAXParser saxParser = spf.newSAXParser();
  26.         //saxParser.setProperty("http://xml.org/sax/features/namespaces", true);
  27.         StudentInfoContentHandler2 handler = new StudentInfoContentHandler2();
  28.         saxParser.parse(file, handler);        
  29.     }    
  30. }

输出结果:
id=10 name=LiMing age=25
id=20 name=XiaoZhang age=30

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP