SAX解析XML:学习

来源:互联网 发布:德拉诺飞行软件 编辑:程序博客网 时间:2024/05/01 17:18

SAX解析XML的学习

一,XML

(1)xml的定义:

    xml是扩展标记语言。用于标记电子文件使其具有结构性的标记语言,可以用来标记数据,定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。适合Web传输

(2)xml的优点

    1.格式统一,有标准。    2.容易交互,数据共享比较方便。

(3)xml的缺点

    1.文件庞大,文件格式复杂,传输占宽带。    2.需要大量代码来解析,使代码变的十分复杂。    3.解析方式不统一。    4.服务器端和客户端汇划费较多的资源和时间。

二,SAX

(1)SAX介绍

    SAX是一个解析速度快并且占用内存少的XML解析器。

(2)SAX原理

    SAX解析器是一种基于事件的解析器,把XML文档转化成一系列的事件来处理。基于事件源和事件处理器。

(3)SAX优点

    不用实现调入整个文档,占用资源少。

(4)SAX缺点

    数据是暂时的,如果没有保存就会造成数据的丢失。

(5)PS:

    可以降低解析门槛,降低对设备的要求。

上代码吧,找了很多例子,最后把自己都绕进去了。到现在才明白了整个流程。

XML代码:

<?xml version="1.0" encoding="utf-8"?><persons>    <person>        <name>Alice</name>        <age>30</age>    </person>    <person>        <name>AXX</name>        <age>18</age>    </person></persons>

XML对应类代码:

/** * Created by hanlei on 2017/7/18. */public class Person {    private String name;    private int age;    public void setName(String name) {        this.name = name;    }    public void setAge(int age) {        this.age = age;    }    public String getName() {        return name;    }    public int getAge() {        return age;    }}

解析类对应代码:

import android.os.Handler;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;import java.util.ArrayList;import java.util.List;/** * Created by hanlei on 2017/7/18. */public class SAXForHander extends DefaultHandler{    private List<Person> persons;    private String perTag;    Person person;    public List<Person> getPersons(){        return persons;    }    //接收文档开始,用于预处理。    //开始解析文档    @Override    public void startDocument() throws SAXException {        persons=new ArrayList<Person>();        System.out.println("startDocument()");    }    //开始解析结点    //接收元素开始的通知。读到一个开始标签的时候,会触发这个方法。其中url表示元素的命名空间    //localName表示元素的本地名称,qName表示元素的限定名;attrs表示元素的属性集合。    @Override    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {        if("person".equals(qName)) {            person=new Person();        }        perTag=qName;        System.out.println("读取结点");    }    //保存结点内容    //接收字符数据的通知。该方法用来处理在XML文件中读取的内容。    //第一个参数用来存放文件的内容。    //后面两个参数是读到的字符串在这个数组中的起始位置和长度。    //使用new String(ch,start,length)就可以获取内容。    @Override    public void characters(char[] ch, int start, int length) throws SAXException {        String data=new String(ch,start,length).trim();//trim去掉两边空格。        if(!"".equals(data.trim()))        {            System.out.println(data.trim());        }        System.out.println(perTag);        if("name".equals(perTag))        {            person.setName(data);        }        else if("age".equals(perTag))        {            person.setAge(Integer.parseInt(data));        }    }    //结束解析节点    //接受到文档的结尾的通知。在遇到结束标签的时候,调用方法。uri表示元素的命名空间。    //localName表示元素的本地元素;qname表示元素的限定名。    @Override    public void endElement(String uri, String localName, String qName) throws SAXException {        System.out.println("endElement");        if("person".equals(qName))        {            persons.add(person);            person=null;        }        perTag=null;    }    //文档解析结束    @Override    public void endDocument() throws SAXException {        System.out.println("emdDcument");    }}

测试类对应代码:

package com.example.hanlei.xml_718;import org.xml.sax.InputSource;import org.xml.sax.SAXException;import org.xml.sax.XMLReader;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.util.List;import javax.xml.XMLConstants;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;/** * Created by hanlei on 2017/7/18. */public class AnalyzeSAM {    public void sss() throws ParserConfigurationException, SAXException, IOException {        InputStream inputStream=new FileInputStream("xiwang.xml");        //SAXParserFactory: Defines a factory API that enables applications        // to configure and obtain a SAX based parser to parse XML documents.        //SAXParserFactory:定义工厂API,使应用程序能够配置和获取基于SAX的解析器来解析XML文档。        //SAXParserFactory:拿到SAX解析器。        //newInstance:Obtain a new instance of a SAXParserFactory.        //newInstance:获得一个工厂中的一个新实例。解析器的实例化。        //SAXParser: In JAXP 1.0, this class wrapped the Parser interface        //SAXParser:解析器接口        //newSAXparser:Creates a new instance of a SAXParser using        // the currently configured factory parameters.        //newSAXparser:创建一个SAXParser实例使用当前配置的工厂参数        SAXParserFactory spf=SAXParserFactory.newInstance();        SAXParser saxParser=spf.newSAXParser();        SAXForHander hander= new SAXForHander();        saxParser.parse(inputStream,hander);        List<Person> persons=hander.getPersons();        inputStream.close();        for(Person person:persons) {            System.out.println("name:"+person.getName());            System.out.println("Age:"+person.getAge());        }    }    public static void main(String []args) throws IOException, SAXException, ParserConfigurationException {        new AnalyzeSAM().sss();    }}

结果显示:
这里写图片描述

完成时间:2017年7月19日03:06:42
晚安啦。