zoukankan      html  css  js  c++  java
  • 每天多一点之SAX解析

    1、About SAX

    在使用 DOM 解析 XML 文档时,需要读取整个 XML 文档,在内存中构建代表整个 DOM 树的Doucment对象,从而再对XML文档进行操作。

    此种情况下,如果 XML 文档特别大,就会消耗计算机的大量内存,严重情况下可能还会导致内存溢出。

    SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作。

    2、SAX解析机制

    sax是一种推式的机制,你创建一个sax 解析器,解析器在发现xml文档中的内容时就告诉你(把事件推给你). 如何处理这些内容,由程序员自己决定。

    在基于sax 的程序中,有五个最常用sax事件:

    startDocument() ----> 告诉你解析器发现了文档的开始,告诉你解析器开始扫描文档.

    endDocument() ---> 告诉你解析器发现了文档尾

    startElement()------> 告诉你解析器发现了一个起始标签,该事件告诉你元素的名称,该元素所有的属性名和值.

    character() -----> 告诉你解析器发现了一些文本,将得到一个字符数组, 该数组的偏移量和一个长度变量,有这三个变量你可以得到解析器所发现的文本.

    endElement()-----> 告诉你解析器发现了一个结束标签,该事件告诉你元素的名称

    3、SAX方式解析XML文档步骤

    使用SAXParserFactory创建SAX解析工厂

    SAXParserFactory spf = SAXParserFactory.newInstance();

    通过SAX解析工厂得到解析器对象

    SAXParser sp = spf.newSAXParser();

    将解析对象和事件处理器对象关联

    sp.parse("src/myClass.xml", new MyHander());

    4、对sax说明:

    1. sax主要用于对xml文件解析(读取),不能去修改,删除,添加元素

    2. sax 是推机制,把发现的内容告诉程序员(函数),程序员可以自己决定如何处理

    5、案例

    XML(myClass.xml):

    <?xml version="1.0" ?>
    <班级>
        <学生>
            <名字>小米</名字>
            <年龄>23</年龄>
            <介绍>三好学生</介绍>
        </学生>
        <学生>
            <名字>小猫</名字>
             <年龄>32</年龄>
            <介绍>坏学生</介绍>
        </学生>
    </班级>


    import javax.xml.parsers.*;
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    public class Sax1 {
        //使用sax技术去解析xml文件.myclasses2.xml
        public static void main(String[] args) throws Exception, SAXException {
            // TODO Auto-generated method stub
            //1.创建SaxParserFactory
            SAXParserFactory spf=SAXParserFactory.newInstance();
            //2.创建SaxParser 解析器
            SAXParser saxParser=spf.newSAXParser();
            //3 把xml文件和事件处理对象关联
            saxParser.parse("src/myclasses2.xml",new MyDefaultHandler2() );
        }
    }
    //请思考,如何只显示学生的名字和年龄
    class MyDefaultHandler2 extends DefaultHandler{
        private boolean isName=false;
        private boolean isAge=false;
        @Override
        public void characters(char[] ch, int start, int length)
                throws SAXException {
            // TODO Auto-generated method stub
            String con=new String(ch,start,length);
            if(!con.trim().equals("")&&(isName||isAge)){
                System.out.println(con);
            }
            isName=false;
            isAge=false;
            //super.characters(ch, start, length);
        }
        @Override
        public void endDocument() throws SAXException {
            // TODO Auto-generated method stub
            super.endDocument();
        }
        @Override
        public void endElement(String uri, String localName, String name)
                throws SAXException {
            // TODO Auto-generated method stub
            super.endElement(uri, localName, name);
        }
        @Override
        public void startDocument() throws SAXException {
            // TODO Auto-generated method stub
            super.startDocument();
        }
        @Override
        public void startElement(String uri, String localName, String name,
                Attributes attributes) throws SAXException {
            // TODO Auto-generated method stub
            if(name.equals("名字")){
                this.isName=true;
            }else if(name.equals("年龄")){
                this.isAge=true;
            }
        }
    }
    //定义事件处理类
    class MyDefaultHandler1 extends DefaultHandler{
        //发现文档开始
        @Override
        public void startDocument() throws SAXException {
            // TODO Auto-generated method stub
            System.out.println("startDocument()");
            super.startDocument();
        }
        //发现xml文件中的一个元素
        @Override
        public void startElement(String uri, String localName, String name,
                Attributes attributes) throws SAXException {
            // TODO Auto-generated method stub
            System.out.println("元素名称="+name);    
        }
        //发现xml文件中的文本
        @Override
        public void characters(char[] ch, int start, int length)
                throws SAXException {
            String con=new String(ch,start,length);
            //显示文本内容:
            if(!con.trim().equals("")){
                System.out.println(new String(ch,start,length));
            }
        }
        //发现xml文件中一个元素介绍</xx>
        @Override
        public void endElement(String uri, String localName, String name)
                throws SAXException {
            // TODO Auto-generated method stub
            super.endElement(uri, localName, name);
        }
        //发现文档结束
        @Override
        public void endDocument() throws SAXException {
            // TODO Auto-generated method stub
            System.out.println("endDocument()");
            super.endDocument();
        }
    }


  • 相关阅读:
    unity基础之C#基础——[转]大白话系列之C#委托与事件讲解(一)
    [转]ListView滚动到底部自动加载数据
    [转]Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)的用法
    EditText光标不显示
    Android应用实例之---使用Linkify + 正则式区分微博文本链接及跳转处理
    安卓自定义控件
    安卓ViewFlipper和ViewPager
    安卓Binder机制简析
    《深入浅出Mysql》笔记---优化
    《高性能MySQL》學習筆記--索引
  • 原文地址:https://www.cnblogs.com/hackerd/p/3098423.html
Copyright © 2011-2022 走看看