• sax解析


    SAX 解析
    1. SAX ( Simple Application interface for XML ), 是一组程序设计接口,采用 observer 模式,将XML文件视为一个文字流的数据,在读取XML 元素时触发一系列的事件

    2. 使用DOM 时是将xml 文件解析为一个树状结构,并对树中的节点进行操作
    使用SAX 加载XML文件时,他的操作像打开一个“顺序的文件字符流”,在读到XML元素的开始标记,结尾标记和内容标记时将产生一系列的事件
    如一个简单的XML文件:<hello><message>hello XML!</message></hello>
    会相应的触发:startDocument, startElement, characters, endElement, endDocument, 只需编写这些事件处理程序就可以解析XML文件了

    3. SAX 可以高效的使用内存,因为SAX 只是顺序的读取XML 文件的内容,并不会将XML 文件完全加载,这样就比DOM 的处理效率高
    但SAX 只能读取XML 文件的内容,而不能更改XML 的内容,也不能随机访问XML 元素

    4. 在SAX 中有4个处理器是要实现的:ContentHandler,DTDHandler,EntityResolver,ErrorHandler,以处理不同的事件,这是比较麻烦的,
    幸好SAX 定义了一个 DefaultHandler 类把这几个实现了,我们只需在 DefaultHandler中定义事件处理方法,然后注册到XMLReader,而SAXParser封装了XMLReader的实现类,
    SAXParser又是由SAXParserFactory提供的,所以我们实际用到的类只有:SAXParserFactory,SAXParser,DefaultHandler

    5. SAX 的解析步骤:
    (1)写一个类继承 DefaultHandler, 实现自己的事件处理方法
    (2)在主程序中建立 SAXParserFactory
    (3)可以设置这个factory 的参数
    (4)从这个factory 得到SAXParser
    (5)解析XML文件

    例子:

    XML 文件:hr.xml
    <?xml version="1.0" encoding="GB2312" ?>
    <!-- 个人履历表-->
    <resume>
    <person id=
    "01">
    <name>张三</name>
    <birthday>03/24/1975</birthday>
    <phone>1111-1111</phone>
    <address>大连</address>
    </person>
    <person id=
    "02">
    <name>李四</name>
    <birthday>9/26/1978</birthday>
    <phone>2222-2222</phone>
    <address>南京</address>
    </person>
    <person id=
    "03">
    <name>王五</name>
    <birthday>11/09/1979</birthday>
    <phone>3333-3333</phone>
    <address>武汉</address>
    </person>
    </resume>


    import javax.xml.parsers.*;
    import org.xml.sax.*;
    import org.xml.sax.helpers.*;

    public class MySaxParser extends DefaultHandler {
    public static void main( String[] args ){
    try{
    // 创建一个handler
    DefaultHandler dh = new MySaxParser();
    // 创建SAXParserFactory
    SAXParserFactory spf = SAXParserFactory.newInstance();
    // 从factory 中得到SAXParser
    SAXParser sp = spf.newSAXParser();
    // 用自定义的handler 解析xml
    sp.parse(
    "08_02.xml", dh );
    }catch( Exception e ){
    e.printStackTrace();
    }
    }
    public void startDocument(){

    }
    /**
    * 当开始一个元素时打印出元素名和此元素的所有属性
    */

    public void startElement(String uri,
    String localName,
    String qName,
    Attributes attributes)
    {
    System.out.print( qName +
    ":" );
    int len = 0;
    len = attributes.getLength();
    if( len > 0 ){
    System.out.print(
    "\t" + "attributes: " );
    for( int i=0; i<len; i++ )
    System.out.print( attributes.getQName(i) +
    "=" + attributes.getValue(i) + "\t" );
    //System.out.println();
    }
    }
    /**
    * 打印出元素内容
    */

    public void characters(char[] ch,
    int start,
    int length)
    {
    String s = String.valueOf( ch, start, length );
    System.out.print( s );
    }
    public void endElement(String uri,
    String localName,
    String qName)
    {

    }
    public void endDocument(){

    }
    }
  • 相关阅读:
    iOS开发-Scheduler attach ERROR when replacing an existing executor !!! id:88
    多层导航栏下的登陆注销架构
    iOS开发-功能篇-静态库
    iOS开发-UI篇-AutoLayout
    iOS开发-数据篇-sqlite存储
    零碎知识整理-外链应用
    零碎知识整理
    iOS开发-功能篇-国际化|NSUserDefaults
    iOS开发-底层篇-Class详解
    swift可选隐式可选类型
  • 原文地址:https://www.cnblogs.com/kentyshang/p/611204.html
Copyright © 2020-2023  润新知