数据解析--sax解析

SAX解析XML 
SAX是Simple API for XML的缩写,SAX是基于事件驱动的,在用SAX解析xml文档时候,在读取到文档开始和结束标签时候就会回调一个事件,在读取到其它节点与内容时也会回调一个事件.事件源是org.xml.sax包中的XMLReader,它通过parser()方法来解析XML文档,并产生事件.事件处理器是DefaultHandler,与DOM比较而言,SAX是一种轻量型的方法.当需要一个速度快的解析器并且希望最大限度的减少应用程序的内存占用时,通常可以使用SAX解析. 
具体思路是: 
*创建SAXParserFactory对象 
SAXParserFactoryspf = SAXParserFactory.newInstance(); 
*根据SAXParserFactory.newSAXParser()方法返回一个SAXParser解析器 
SAXParsersp = spf.newSAXParser(); 
*根据SAXParser解析器获取事件源对象XMLReader 
XMLReader reader = sp.getXMLReader(); 
*实例化一个DefaultHandler对象(StudentHandler是一事件处理器) 
StudentHandler handler = newStudentHandler(students); 
*连接事件源对象XMLReader到事件处理DefaultHander 
reader.setContentHandler(handler); 
*调用XMLReader的parse方法从输入源获取到xml数据 
*通过DefaultHandler返回我们需要的数据集合 
注:重点在于DefaultHandler对象中对每一个元素节点,属性,文本内容,文档内容的处理. 
***************相关代码*******

  1 //实例化一个DefaultHandler对象(StudentHandler是一事件处理器)
  2
  3
  4 public class StudentHandler extends DefaultHandler {
  5 private List<Student> mstudent;
  6 private String mtagname;
  7 private Student student;
  8
  9
 10
 11 public StudentHandler() {
 12 super();
 13 // TODO Auto-generated constructor stub
 14 }
 15 public StudentHandler(List<Student> mstudent) {
 16 super();
 17 this.mstudent = mstudent;
 18 }
 19 //开始解析文档
 20 @Override
 21 public void startDocument() throws SAXException {
 22
 23 super.startDocument();
 24 }
 25    //解析xml文档结尾
 26 @Override
 27 public void endDocument() throws SAXException {
 28
 29 super.endDocument();
 30 }
 31
 32 //解析开始标签
 33 //元素节点
 34 @Override
 35 public void startElement(String uri, String localName, String qName,
 36 Attributes attributes) throws SAXException {
 37             this.mtagname = localName;
 38             if("student".equals(mtagname)){
 39             student = new Student();
 40             student .setId(Integer.valueOf(attributes.getValue("id")));
 41
 42             }
 43             else if("age".equals(mtagname)){
 44             student .setAge(Integer.valueOf(attributes.getValue(0)));
 45             }
 46 super.startElement(uri, localName, qName, attributes);
 47 }
 48 //解析标签 结束
 49 @Override
 50 public void endElement(String uri, String localName, String qName)
 51 throws SAXException {
 52       this.mtagname= localName;
 53       if("student".equals(mtagname)){
 54     mstudent.add(student);
 55     student = null;
 56       }
 57       mtagname = "";
 58 Log.i("TAG", "infor");
 59       super.endElement(uri, localName, qName);
 60
 61 }
 62 //解析文本标签
 63 @Override
 64 public void characters(char[] ch, int start, int length)
 65 throws SAXException {
 66           String name = new String (ch,start,length);
 67           if(!name.trim().equals("")&&"name".equals(mtagname)){
 68           student.setName(name);
 69           }
 70           Log.i("TAG", "infor");
 71 super.characters(ch, start, length);
 72 }
 73 }
 74 *****************************sax解析*************
 75 //student是一个实体类,有name,age,参数和构造方法,toString输出
 76
 77 public class SaxParserActivity extends Activity {
 78 private TextView mtextview;
 79 private ListView mlistview;
 80 @Override
 81 protected void onCreate(Bundle savedInstanceState) {
 82
 83 super.onCreate(savedInstanceState);
 84 setContentView(R.layout.domparser);
 85 mtextview = (TextView) findViewById(R.id.textView1);
 86 mlistview = (ListView) findViewById(R.id.listView1);
 87 mtextview.setText("sax解析xml");
 88
 89 List<Student> list = parser();
 90 ArrayAdapter<Student> adapter = new ArrayAdapter<Student>(this,android.R.layout.simple_expandable_list_item_1,list);
 91 mlistview.setAdapter(adapter);
 92
 93 }
 94 private List<Student> parser() {
 95 List <Student> list = new ArrayList<Student>();
 96 try {
 97 // 获取工厂
 98 SAXParserFactory sax  = SAXParserFactory.newInstance();
 99 //获取sax解析器
100         SAXParser sf = sax.newSAXParser();
101 //获取事件源
102 XMLReader xmlreader = sf.getXMLReader();
103 //创建事件处理器
104 StudentHandler studenthandle = new StudentHandler(list);
105 //  将事件处理器设置到事件源
106 xmlreader.setContentHandler(studenthandle);
107 //触发解析事件,读取raw下面的文档
108 xmlreader.parse(new InputSource(getResources().openRawResource(R.raw.student)));
109 } catch (Exception e) {
110 // TODO Auto-generated catch block
111 Log.i("TAG",""+e.getMessage());
112 }
113 return list;
114 }
115 } 
时间: 2024-10-12 11:57:28

数据解析--sax解析的相关文章

俩种XML解析SAX解析和Pull解析

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">SAX是基于事件流,而DOM是基于文档树结构. </span> DOM原理:先将文件读取进入一个驻入内存的树结构.因为在内存,便于操作和管理,但是浪费资源和时间. SAX原理: 基于事件,这个表示读取到xml的结点会根据结点名称来读取相应的数据,占用资源少.但是无状态,非持久

XML的两种解析方式逐行解析(SAX解析)节点解析(DOM解析);

SAX逐行解析 SAX:SimpleAPIfor XML.基于事件驱动的解析方式,逐行解析数据.(采用协议回调机制) NSXMLParser是iOS自带的XML解析类.采用SAX方式解析数据 解析过程由NSXMLParserDelegate协议方法回调 解析过程:开始标签->取值->结束标签->取值 DOM解析 DOM:DocumentObjectModel(文档对象模型).解析时需要将XML文件整体读入,并且将XML结构化成树状,使用时再通过树状结构读取相关数据 GDataXMLNod

XCode自带解析SAX解析

1 #import "XMLViewController.h" 2 #import "Student.h" 3 @interface XMLViewController ()<NSXMLParserDelegate> 4 @property (strong,nonatomic) NSMutableArray *stuArray; 5 @property (strong,nonatomic) Student *student; 6 @property (s

XML数据解析 SAX解析(内容解析)

本文使用的XML文档形式:与上一篇文章的XML文档格式是不同的,解析方法稍做改动 给出关键代码截图:其余部分去前面的文章中找,复制下来,修改后自己写一下. 如果你对代码中所写的逻辑不清楚,说明对XML文档的格式和NSXMLParser那几个代理方法执行顺序还不清楚,自己看看不同格式的XML文档中代理方法的执行顺序就OK了, 补充:使用NSURLSession后就忽略了线程的概念,本意是不需要我们管理的.知道一下还是好的 NSXMLParser的代理方法都是在子线程执行,以及\下面的代码都是在子线

XML.03-DOM和SAX解析

body,td { font-family: calibri; font-size: 10pt } XML.03-DOM和SAX解析 XML的DOM解析 解析 处理 回写 XML的SAX解析 SAX和DOM方式的不同: SAX解析原理 SAX解析范例 解析xml常用的有两种方式,DMO和SAX DOM和SAX的区别: DOM: 在内存中生成树桩结构 优点是可以支持增删改查各种操作 缺点在于,如果文档过大的时候,可能会产生内存溢出的风险 SAX: 基于事件驱动,边读边解析 优点:占用内存小 缺点,

SAX解析

1DOM解析与SAX解析比较: DOM解析 SAX解析 原理: 一次性加载xml文档,不适合大容量的文件读取 原理: 加载一点,读取一点,处理一点.适合大容量文件的读取 DOM解析可以任意进行增删改成 SAX解析只能读取 DOM解析任意读取任何位置的数据,甚至往回读 SAX解析只能从上往下,按顺序读取,不能往回读 DOM解析面向对象的编程方法(Node,Element,Attribute),Java开发者编码比较简单. SAX解析基于事件的编程方法.java开发编码相对复杂. 2 SAX解析工具

XML学习总结-DOM和SAX解析-综合案例-(四)

============DOM解析    vs   SAX解析             ======== DOM解析 SAX解析 原理: 一次性加载xml文档,不适合大容量的文件读取 原理: 加载一点,读取一点,处理一点.适合大容量文件的读取 DOM解析可以任意进行增删改成 SAX解析只能读取 DOM解析任意读取任何位置的数据,甚至往回读 SAX解析只能从上往下,按顺序读取,不能往回读 DOM解析面向对象的编程方法(Node,Element,Attribute),Java开发者编码比较简单. S

XML - 十分钟了解XML结构以及DOM和SAX解析方式

引言 NOKIA 有句著名的广告语:"科技以人为本".不论什么技术都是为了满足人的生产生活须要而产生的.详细到小小的一个手机.里面蕴含的技术也是浩如烟海.是几千年来人类科技的结晶,单个人穷其一生也未必能掌握其一角.只是个人一直觉得主要的技术和思想是放之四海而皆准的,很多技术未必须要我们从头到尾再研究一遍.我们要做的就是站在巨人的肩膀上.利用其成果来为人们的需求服务. 随着移动互联网时代的大潮.越来越多的App不光是须要和网络server进行数据传输和交互,也须要和其它 App 进行数据

Java xml 操作(Dom4J修改xml &#160;&#160;+ xPath技术 &#160;+ SAX解析 + XML约束)

1 XML基础 1)XML的作用 1.1 作为软件配置文件 1.2 作为小型的"数据库" 2)XML语法(由w3c组织规定的) 标签: 标签名不能以数字开头,中间不能有空格,区分大小写.有且仅有一个根标签. 属性: 可有多个属性,但属性值必须用引号(单引号或双引号)包含,但不能省略,也不能单 双混用. 文档声明: <?xml version="1.0" encoding="utf-8"?> encoding="utf-8&q