XML解析之SAX解析
来源:互联网 发布:windows redmine 迁移 编辑:程序博客网 时间:2024/05/22 01:30
1.SAX是一种解析速度快且占用内存少的一种XML解析器。SAX解析XML文件采用的是事件驱动。所谓事件就是一些回调方法,这些方法定义在ContentHandler接口中。
2.接下来看下ContentHandler接口中的几个方法:
*startDocunment():当遇到文档的开头的时候触发此事件,做一些预处理工作。
*endDocument():当文档结束的时候触发此事件,做一些后续的处理工作。
*startElement(String namespaceURI,String localName,String qName,Attributes atts):当遇到开始标签的时候触发此事件。namespaceURI就是命名空间,localName就是不带命名空间前缀的标签名,qName就是带命名空间前缀的标签名,可以通过atts获得所有的属性名和属性值。
endElement(String uri,String localName,String name):当遇到标签结尾的时候触发此方法。
character(char[] ch,int start,int length):当遇到xml文档内容的时候触发此事件。
3.接下来看一个简单的SAX解析XML的Demo:
首先看下Demo项目结构:
看下我们需要解析的这个itcast.xml文件的内容:
<?xml version="1.0" encoding="utf-8"?><persons> <person id="1"> <name>张三</name> <age>18</age> </person> <person id="2"> <name>李四</name> <age>19</age> </person></persons>
定义的Person类的内容:
package com.android.douf;//定义person类public class Person{ @Override public String toString() { return super.toString(); } private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; }}
定义一个类继承DefaultHandler类,实现其解析方法:
package com.android.douf;import java.util.ArrayList;import java.util.List;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;import android.util.Log;//继承DefaultHandler类,实现其解析方法public class XMLContentHandler extends DefaultHandler{ private static final String TAG = "XMLContentHandler"; private List<Person> persons; private Person person; private String tag = null; public List<Person> getPersons() { return persons; } @Override public void startDocument() throws SAXException { persons = new ArrayList<Person>(); Log.i(TAG, "开始解析"); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if ("person".equals(localName)) { person = new Person(); } tag = localName; } @Override public void characters(char[] ch, int start, int length) throws SAXException { String data = new String(ch, start, length); if (tag!=null) { if ("name".equals(tag)) { person.setName(data); } if ("age".equals(tag)) { person.setAge(Integer.parseInt(data)); } } Log.i(tag, "解析内容"+data); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if ("person".equals(localName)&&person!=null) { persons.add(person); } tag = null; } @Override public void endDocument() throws SAXException { Log.i(tag, "解析结束"); } }
SAX_Service类,创建解析工厂获取解析器进行解析:
package com.android.douf;import java.io.InputStream;import java.util.List;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;public class SAX_Service{ public List<Person> readXML(InputStream is) throws Exception{ //创建解析工厂 SAXParserFactory spf = SAXParserFactory.newInstance(); //获取解析器 SAXParser sp = spf.newSAXParser(); XMLContentHandler handler = new XMLContentHandler(); //进行解析 sp.parse(is, handler); is.close(); return handler.getPersons(); }}
其次是Activity类内容:
package com.android.douf;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class SAX_XMLActivity extends Activity { private Button button; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); button = (Button) findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //获取系统中药解析的xml文件,加入到输入流中 InputStream is = SAX_XMLActivity.class.getClassLoader().getResourceAsStream("itcast.xml"); List<Person> persons = new ArrayList<Person>(); try { SAX_Service sax_service = new SAX_Service(); //将输入流中的内容进行解析 persons = sax_service.readXML(is); String name = persons.get(0).getName(); int age = persons.get(0).getAge(); String name_ = persons.get(1).getName(); int age_ = persons.get(1).getAge(); System.out.println("name:"+name+"\t"+"age"+age+"\n"+"name_:"+name_+"\t"+"age_:"+age_); } catch (Exception e) { e.printStackTrace(); } } }); }}
运行结果显示如下:
以上就实现了一个简单的SAX解析。
- 解析xml之--SAX
- 解析xml之--SAX
- 解析xml之--SAX
- XML解析之SAX
- XML 解析之SAX
- XML解析之SAX
- 【xml之SAX解析】
- XML解析之SAX
- 解析XML之SAX
- xml之SAX解析
- xml之sax解析
- xml解析之sax
- XML解析之SAX
- xml解析之SAX
- XML之sax解析
- XML解析之SAX
- xml之SAX解析
- Xml之Sax解析
- JBOSS AS5.1 默认tag的实例是单例, 修改配置可以改成非单例
- cocos2d-x学习(二):动作Action(延时类动作)
- HDU 1104 BFS 队列
- shell 入门
- Gridpanel中设置默认选中行的功能实现
- XML解析之SAX解析
- Cocos2d-x学习(五):cocos2d-x解析json(使用libjson库)
- 12个有趣的C语言面试题
- Cocos2d-x学习(六):cocos2d-x中的模态对话框简单实现
- 九种常用排序的性能分析总结
- Cocos2d-x学习(七):cocos2d-x中ScrollView的简单实现
- 计算程序跑了多长时间
- Cocos2d-x学习(八):cocos2d-x 2.0 中CCListView的用法
- Cocos2d-x学习(九):cocos2d-x 无限背景滚动