一,为什么要用它

1.1,讲解

DOM解析原理:一次性把xml文档加载进内存,然后在内存中构建Document树。

对内存要求比较要。

缺点: 不适合读取大容量的xml文件,容易导致内存溢出。

SAX解析原理: 加载一点,读取一点,处理一点。对内存要求比较低。

SAX解析工具-  Sun公司提供的。内置在jdk中。org.xml.sax.*

核心的API:

SAXParser类: 用于读取和解析xml文件对象

parse(File f, DefaultHandler dh)方法: 解析xml文件

参数一: File:表示 读取的xml文件。

参数二: DefaultHandler: SAX事件处理程序。使用DefaultHandler的子类

1.2,数据

 <contactList>
     <contact id="001" name="eric">
         <name>张三</name>
         <age>20</age>
         <phone>134222223333</phone>
         <email>zhangsan@qq.com</email>
         <qq>432221111</qq>
     </contact>
     <contact id="002" name="jacky">
         <name>eric</name>
         <age>20</age>
         <phone>134222225555</phone>
         <email>lisi@qq.com</email>
         <qq>432222222</qq>
     </contact>
 </contactList>

二,语法

2.1,图解

2.2,案例一 (读取数据)

 public class Demo1 {

     public static void main(String[] args) throws Exception{
         //1.创建SAXParser对象
         SAXParser parser = SAXParserFactory.newInstance().newSAXParser();

         //2.调用parse方法
         /**
          * 参数一: xml文档
          * 参数二: DefaultHandler的子类
          */
         parser.parse(new File("./src/contact.xml"), new MyDefaultHandler());
     }

 }
 package gz.itcast.c_sax;

 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
 /**
  * SAX处理程序(如何解析xml文档)
  * @author APPle
  *
  */
 public class MyDefaultHandler extends DefaultHandler {

     /**
      * 开始文档时调用
      */
     @Override
     public void startDocument() throws SAXException {
         System.out.println("MyDefaultHandler.startDocument()");
     }

     /**
      * 开始标签时调用
      * @param qName: 表示开始标签的标签名
      * @param attributes: 表示开始标签内包含的属性列表
      */
     @Override
     public void startElement(String uri, String localName, String qName,
             Attributes attributes) throws SAXException {
         System.out.println("MyDefaultHandler.startElement()-->"+qName);
     }

     /**
      * 结束标签时调用
      * @param qName: 结束标签的标签名称
      */
     @Override
     public void endElement(String uri, String localName, String qName)
             throws SAXException {
         System.out.println("MyDefaultHandler.endElement()-->"+qName);
     }

     /**
      * 读到文本内容的时调用
      * @param ch: 表示当前读完的所有文本内容
      * @param start: 表示当前文本内容的开始位置
      * @param length: 表示当前文本内容的长度
      * char[](                                       张三              20)   100
      *                              98 2
      */
     @Override
     public void characters(char[] ch, int start, int length)
             throws SAXException {
         //得到当前文本内容
         String content = new String(ch,start,length);
         System.out.println("MyDefaultHandler.characters()-->"+content);
     }

     /**
      * 结束文档时调用
      */
     @Override
     public void endDocument() throws SAXException {
         System.out.println("MyDefaultHandler.endDocument()");
     }

 }

结果

 MyDefaultHandler.startDocument()
 MyDefaultHandler.startElement()-->contactList
 MyDefaultHandler.characters()-->

 MyDefaultHandler.startElement()-->contact
 MyDefaultHandler.characters()-->

 MyDefaultHandler.startElement()-->name
 MyDefaultHandler.characters()-->张三
 MyDefaultHandler.endElement()-->name
 MyDefaultHandler.characters()-->

 MyDefaultHandler.startElement()-->age
 MyDefaultHandler.characters()-->20
 MyDefaultHandler.endElement()-->age
 MyDefaultHandler.characters()-->

 MyDefaultHandler.startElement()-->phone
 MyDefaultHandler.characters()-->134222223333
 MyDefaultHandler.endElement()-->phone
 MyDefaultHandler.characters()-->

 MyDefaultHandler.startElement()-->email
 MyDefaultHandler.characters()-->zhangsan@qq.com
 MyDefaultHandler.endElement()-->email
 MyDefaultHandler.characters()-->

 MyDefaultHandler.startElement()-->qq
 MyDefaultHandler.characters()-->432221111
 MyDefaultHandler.endElement()-->qq
 MyDefaultHandler.characters()-->

 MyDefaultHandler.endElement()-->contact
 MyDefaultHandler.characters()-->

 MyDefaultHandler.startElement()-->contact
 MyDefaultHandler.characters()-->

 MyDefaultHandler.startElement()-->name
 MyDefaultHandler.characters()-->eric
 MyDefaultHandler.endElement()-->name
 MyDefaultHandler.characters()-->

 MyDefaultHandler.startElement()-->age
 MyDefaultHandler.characters()-->20
 MyDefaultHandler.endElement()-->age
 MyDefaultHandler.characters()-->

 MyDefaultHandler.startElement()-->phone
 MyDefaultHandler.characters()-->134222225555
 MyDefaultHandler.endElement()-->phone
 MyDefaultHandler.characters()-->

 MyDefaultHandler.startElement()-->email
 MyDefaultHandler.characters()-->lisi@qq.com
 MyDefaultHandler.endElement()-->email
 MyDefaultHandler.characters()-->

 MyDefaultHandler.startElement()-->qq
 MyDefaultHandler.characters()-->432222222
 MyDefaultHandler.endElement()-->qq
 MyDefaultHandler.characters()-->

 MyDefaultHandler.endElement()-->contact
 MyDefaultHandler.characters()-->

 MyDefaultHandler.endElement()-->contactList
 MyDefaultHandler.endDocument()

2.3,原模原样的输出数据

 package gz.itcast.c_sax;

 import java.io.File;

 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;

 /**
  * 读取contact.xml文件,完整输出文档内容
  * @author APPle
  *
  */
 public class Demo2 {

     public static void main(String[] args)throws Exception {
         //1.创建SAXParser
         SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
         //2.读取xml文件
         MyDefaultHandler2 handler = new MyDefaultHandler2();
         parser.parse(new File("./src/contact.xml"), handler);
         String content = handler.getContent();
         System.out.println(content);
     }

 }
 package gz.itcast.c_sax;

 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
 /**
  * SAX处理器程序
  * @author APPle
  */
 public class MyDefaultHandler2 extends DefaultHandler {
     //存储xml文档信息
     private StringBuffer sb = new StringBuffer();

     //获取xml信息
     public String getContent(){
         return sb.toString();
     }

     /**
      * 开始标签
      */
     @Override
     public void startElement(String uri, String localName, String qName,
             Attributes attributes) throws SAXException {
         sb.append("<"+qName);
         //判断是否有属性
         if(attributes!=null){
             for(int i=0;i<attributes.getLength();i++){
                 //得到属性名称
                 String attrName = attributes.getQName(i);
                 //得到属性值
                 String attrValue = attributes.getValue(i);
                 sb.append(" "+attrName+"=\""+attrValue+"\"");
             }
         }
         sb.append(">");
     }

     /**
      * 文本内容
      */
     @Override
     public void characters(char[] ch, int start, int length)
             throws SAXException {
         //得到当前读取的文本
         String content = new String(ch,start,length);
         sb.append(content);
     }

     /**
      * 结束标签
      */
     @Override
     public void endElement(String uri, String localName, String qName)
             throws SAXException {
         sb.append("</"+qName+">");
     }
 }

结果:

 <contactList>
     <contact id="001" name="eric">
         <name>张三</name>
         <age>20</age>
         <phone>134222223333</phone>
         <email>zhangsan@qq.com</email>
         <qq>432221111</qq>
     </contact>
     <contact id="002" name="jacky">
         <name>eric</name>
         <age>20</age>
         <phone>134222225555</phone>
         <email>lisi@qq.com</email>
         <qq>432222222</qq>
     </contact>
 </contactList>

2.4,案例三  使用sax解析把 xml文档封装成对象

package gz.itcast.c_sax;

public class Contact {
    private String id;
    private String name;
    private String age;
    private String phone;
    private String email;
    private String qq;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getQq() {
        return qq;
    }
    public void setQq(String qq) {
        this.qq = qq;
    }
    @Override
    public String toString() {
        return "Contact [age=" + age + ", email=" + email + ", id=" + id
                + ", name=" + name + ", phone=" + phone + ", qq=" + qq + "]";
    }

}
 package gz.itcast.c_sax;

 import java.io.File;
 import java.util.List;

 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;

 /**
  * 使用sax解析把 xml文档封装成对象
  * @author APPle
  *
  */
 public class Demo3 {

     public static void main(String[] args)throws Exception {
         SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
         MyDefaultHandler3 handler = new MyDefaultHandler3();
         parser.parse(new File("./src/contact.xml"), handler);
         List<Contact> list = handler.getList();
         for (Contact contact : list) {
             System.out.println(contact);
         }
     }
 }
 package gz.itcast.c_sax;

 import java.util.ArrayList;
 import java.util.List;

 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
 /**
  * SAX处理程序
  * @author APPle
  *
  */
 public class MyDefaultHandler3 extends DefaultHandler {
     //存储所有联系人对象
     private List<Contact> list = new ArrayList<Contact>();

     public List<Contact> getList(){
         return list;
     }
     //保存一个联系人信息
     private Contact contact;
     /**
      * 思路:
      *     1)创建Contact对象
      *  2)把每个contact标签内容存入到Contact对象
      *  3)把Contact对象放入List中
      */
     //用于临时存储当前读到的标签名
     private String curTag;

     @Override
     public void startElement(String uri, String localName, String qName,
             Attributes attributes) throws SAXException {
         curTag = qName;
         //读取到contact的开始标签创建Contact对象
         if("contact".equals(qName)){
             contact = new Contact();

             //设置id值
             contact.setId(attributes.getValue("id"));
         }
     }

     @Override
     public void characters(char[] ch, int start, int length)
             throws SAXException {
         //当前文本内容
         String content = new String(ch,start,length);

         if("name".equals(curTag)){
             contact.setName(content);
         }

         if("age".equals(curTag)){
             contact.setAge(content);
         }

         if("phone".equals(curTag)){
             contact.setPhone(content);
         }

         if("email".equals(curTag)){
             contact.setEmail(content);
         }

         if("qq".equals(curTag)){
             contact.setQq(content);
         }
     }

     @Override
     public void endElement(String uri, String localName, String qName)
             throws SAXException {
         //设置空时为了避免空格换行设置到对象的属性中
         curTag = null;
         //读到contact的结束标签放入List中
         if("contact".equals(qName)){
             list.add(contact);
         }
     }
 }
 Contact [age=20, email=zhangsan@qq.com, id=001, name=张三, phone=134222223333, qq=432221111]
 Contact [age=20, email=lisi@qq.com, id=002, name=eric, phone=134222225555, qq=432222222]

xml的SAX解析规则的更多相关文章

  1. xml的SAX解析和dom解析的区别

    一,区别 DOM解析 SAX解析 原理: 一次性加载xml文档,不适合大容量的文件读取 原理: 加载一点,读取一点,处理一点.适合大容量文件的读取 DOM解析可以任意进行增删改成 SAX解析只能读取 ...

  2. XML之SAX解析模型

    DOM解析会把整个XML文件全部映射成Document里的树形结构,当遇到比较大的文件时,它的内存占用很大,查找很慢 SAX就是针对这种情况出现的解决方案,SAX解析器会从XML文件的起始位置起进行解 ...

  3. 【文件处理】xml 文件 SAX解析

    SAX的全称是Simple APIs for XML,也即XML简单应用程序接口. 与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式. 当使用SAX分析器对XML文档 ...

  4. Android解析XML之SAX解析器

    SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的.当事件源产生事件后,调用事件处理器相应的处理方法,一个事件 ...

  5. xml——dom&sax解析、DTD&schema约束

    dom解析实例: 优点:增删改查一些元素等东西方便 缺点:内存消耗太大,如果文档太大,可能会导致内存溢出 sax解析: 优点:内存压力小 缺点:增删改比较复杂 当我们运行的java程序需要的内存比较大 ...

  6. 使用jaxp对比xml进行SAX解析

    package cn.itcast.sax; import java.io.IOException; import javax.xml.parsers.ParserConfigurationExcep ...

  7. xml的xPath解析规则

    一,为什么要用xpath技术 问题:当使用dom4j查询比较深的层次结构的节点(标签,属性,文本),比较麻烦!!! 二,xpath的规则 2.1,/根元素的案例 /AAA 选择根元素AAA       ...

  8. xml的Dom4j解析规则

    一,xml的样本 <?xml version="1.0" encoding="utf-8"?> <contactList> <co ...

  9. JavaWeb学习笔记——XML和SAX解析区别

随机推荐

  1. BZOJ 1192: [HNOI2006]鬼谷子的钱袋 [娱乐]

    题意: n个数分组,使得小于n的每个数都能表示出来,最少几组 就是“最优集合”的超级弱化版.....每次+=now+1 然后一个貌似科学的方法是n二进制拆分 #include <iostream ...

  2. 蓝桥杯 基础练习 之 FJ的字符串

    问题描述 FJ在沙盘上写了这样一些字符串: A1 = "A" A2 = "ABA" A3 = "ABACABA" A4 = "AB ...

  3. ★Linux桌面系统技巧(作为客户端)

    [安装chrome浏览器]* 下载(已下载完成):32位:wget https://dl.google.com/linux/direct/google-chrome-stable_current_i3 ...

  4. ApiManager搭建

    piManager 作为一个Api 文档管理工具,而且是开源的,作为开发者使用,还是蛮不错的,整体的界面也很友好,下面就来看一下吧. 下面就来介绍下ApiManager在centos 6下的搭建过程吧 ...

  5. 洛谷P1896 [SCOI2005]互不侵犯King【状压DP】

    题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 输入格式: 只有一行,包含两个数N,K ...

  6. CENTOS6.6下redis3.2集群搭建

    本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn [参考:]http://blog.csdn.net/zhu_tian ...

  7. 【学习笔记】Spring中的BeanFactory和ApplicationContext 以及 Bean的生命周期(Y2-3-2)

    BeanFactory和ApplicationContext Spring的IoC容器就是一个实现了BeanFactory接口的可实例化类. Spring提供了两种不同的容器: 一种是最基本的Bean ...

  8. ASP.NET与ASP.NET MVC 的差异、优点及缺点

    众所周知,在微软的编程语言发展历史中,asp.net是不得不提的一个重要的发展阶段,它具有快速开发.层级明确的优点,但最大的缺点,同时也是它逐渐被废弃的原因就是,页面加载的viewstate过于庞大, ...

  9. 求指定区间内与n互素的数的个数 容斥原理

    题意:给定整数n和r,求区间[1, r]中与n互素的数的个数. 详细见容斥定理 详细代码如下 int solve(int r, int n) { vector<int>p; p.clear ...

  10. Redux:从action到saga

    前端应用消失的部分 一个现代的.使用了redux的前端应用架构可以这样描述: 一个存储了应用不可变状态(state)的store 状态(state)可以被绘制在组件里(html或者其他的东西).这个绘 ...