Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 424|回复: 0

[xml学习]XML文件解析技术:SAX解析

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-10 01:57:43 | 显示全部楼层 |阅读模式
    这种处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX 还比它的替代者 DOM 快许多。  
       
         选择
         DOM 还是选择 SAX ?
       
       
        对于需要自己编写代码来处理
         XML 文档的开发人员来说,选择 DOM 还是 SAX 解析模型是一个非常重要的设计决策。
       
       
        区别:
       
       
        DOM 采用建立树形结构的方式访问 XML 文档,而 SAX 采用的事件模型。
       
       
       
          
        DOM 解析器把 XML 文档转化为一个包含其内容的树,并可以对树进行遍历。
       
      
       
       
         
       

         
       
      



    用 DOM 解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用 DOM 解析器的时候需要处理整个 XML 文档,所以对性能和内存的要求比较高,尤其是遇到很大的 XML 文件的时候。由于它的遍历能力,DOM 解析器常用于 XML 文档需要频繁的改变的服务中。



            SAX 解析器采用了基于事件的模型,它在解析
      XML 文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX 对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX 这种扩展能力得到了更好的体现。


    但是用 SAX 解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。


      


    准备活动:
    1. 1. java.util.Stack<E>是java.util.Vector的子类。<E>
    复制代码
       
    1. Stack
    复制代码
    类表示后进先出(LIFO)的对象堆栈。它通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈。它提供了通常的 push() 和 pop() 操作,以及取栈顶点的 peek() 方法,测试堆栈是否为空的 empty()方法、在堆栈中查找项并确定到栈顶距离的 search 方法。
    1.     首次创建堆栈时,它不包含数据项。
    复制代码
    2.        org.xml.sax.helpers.DefaultHandler[/code]
    1. public class DefaultHandler
    复制代码
    extends Object [/code] implements EntityResolver, DTDHandler, ContentHandler, ErrorHandler[/code]

    startElement()
    ;接收元素开始的通知。


    characters();//接收元素中字符数据的通知。


      


    例如:


    创建
    emps.xml到F盘根目录下


    <?xml version="1.0" encoding="UTF-8"?>


    <emps>


         <emp id="1">


             <name>zhangsan</name>


             <sex>man</sex>


         </emp>


         <emp id="2">


             <name>lisi</name>


             <sex>women</sex>


         </emp>


    </emps>


      


    解析类:


    package
      com.xml;


      


    import
      java.io.IOException;


      


    import
      javax.xml.parsers.ParserConfigurationException;


    import
      javax.xml.parsers.SAXParser;


    import
      javax.xml.parsers.SAXParserFactory;


      


    import
      org.xml.sax.Attributes;


    import
      org.xml.sax.SAXException;


    import
      org.xml.sax.helpers.DefaultHandler;


      


    public
    class
      ParseXML
    extends
      DefaultHandler {


         
    //
    获取栈实例


         java.util.Stack
    tags
      =
    new
      java.util.Stack();


      


         
    public
      ParseXML() {


             
    super
    ();


         }


         
    //
    解析xml文件


         
    public
    void
      getXML() {


             SAXParserFactory factory = SAXParserFactory.newInstance();


             
    try
      {


                 SAXParser parser = factory.newSAXParser();


                 ParseXML parX =
    new
      ParseXML();


                 parser.parse(
    "F:\emps.xml"
    , parX);


             }
    catch
      (Exception e) {


                
    //
    TODO
      Auto-generated catch block


                 e.printStackTrace();


             }


         }


      


         
    //
    重写方法characters(...);


         
    public
    void
      characters(
    char
      ch[],
    int
      start,
    int
      length)


                
    throws
      SAXException {


             
    //
    取出栈顶元素


             String tag = (String)
    tags
    .peek();


             
    //
    比较栈顶元素


             String text =
    new
      String(ch, start, length);


             
    if
    (tag.equals(
    "emps"
    )){


                 System.
    out
    .println(
    "<emps>"
    );


                
    tags
    .pop();


             }


             
    if
      (tag.equals(
    "name"
    )) {


                 System.
    out
    .print(
    " <name>"
      + text);


                
    tags
    .pop();


             }
    else
    if
      (tag.equals(
    "sex"
    )) {


                 System.
    out
    .print(
    " <sex>"
      + text);


                
    tags
    .pop();


             }


      


         }


      


         
    //
    重写方法startElement(...);


         
    public
    void
      startElement(String uri, String localName, String qName,


                 Attributes attrs) {


             
    tags
    .push(qName);
    //
    把项压入栈顶


             
    // System.out.println(qName);


             
    if
      (qName.equals(
    "emp"
    )) {


                 String attName = attrs.getQName(0);


                 String attValue = attrs.getValue(0);


                 System.
    out
    .print(
    " <"
      + qName +
    " "
    );


                 System.
    out
    .println(attName +
    "=""
      + attValue +
    "">"
    );


             }


         }


         
    //
    重写方法endElement(...);


         
    public
    void
      endElement(String uri, String localName, String qName)
    throws
      SAXException {


             
    //
    TODO
      Auto-generated method stub


             
    if
    (qName.equals(
    "emps"
    )){


                 System.
    out
    .println(
    "</emps>"
    );


             }
    else
    if
    (qName.equals(
    "emp"
    )){


                 System.
    out
    .println(
    " </emp>"
    );


             }
    else
    if
    (qName.equals(
    "name"
    )){


                 System.
    out
    .println(
    "</name>"
    );


             }
    else
    if
    (qName.equals(
    "sex"
    )){


                 System.
    out
    .println(
    "</sex>"
    );


             }


         }


         
    public
    static
    void
      main(String[] args) {


             
    new
      ParseXML().getXML();


         }


    }


    显示结果:


    <emps>


      <emp id="1">


      <name>zhangsan</name>


      <sex>man</sex>


      </emp>


      <emp id="2">


      <name>lisi</name>


      <sex>women</sex>


      </emp>


    </emps>




      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/10/10/015742687.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-26 18:17 , Processed in 0.337102 second(s), 36 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表