一,为什么要用它

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. 夏令营讲课内容整理 Day 5.

    DP专场.. 动态规划是运筹学的一个分支, 求解决策过程最优化的数学方法. 我们一般把动态规划简称为DP(Dynamic Programming)   1.动态规划的背包问题 有一个容量为m的背包,有 ...

  2. BZOJ 4031: [HEOI2015]小Z的房间 [矩阵树定理 行列式取模]

    http://www.lydsy.com/JudgeOnline/problem.php?id=4031 裸题........ 问题在于模数是$10^9$ 我们发现消元的目的是让一个地方为0 辗转相除 ...

  3. Matlab中图论工具箱的应用

    Matlab图论工具箱的命令见表1 表1  matlab图论工具箱的相关命令 命令名 功能 graphallshortestpaths 求图中所有顶点对之间的最短距离 graphconncomp 找无 ...

  4. 浅学vue

    因之前项目接触了vue,从此我被迷住,简洁而不失优雅,小巧而不乏大匠. 首先我们要了解vue,什么是vue,正如官网所说:Vue.js 是一套构建用户界面的渐进式框架,Vue 的核心库只关注视图层.V ...

  5. tcping-安装

    1.LINUX安装方法: 下载地址: http://www.linuxco.de/tcping/tcping.html 不过LINUX操作比WINDOWS的差.建议还是使用WINDOWS版本. 2.W ...

  6. Vuex源码解析

    写在前面 因为对Vue.js很感兴趣,而且平时工作的技术栈也是Vue.js,这几个月花了些时间研究学习了一下Vue.js源码,并做了总结与输出. 文章的原地址:https://github.com/a ...

  7. 微信小程序半周问题总结

    新产品要做一个微信小程序,不想吐槽老板没给任何准备就给出了需求和原型图,好像默认小程序闭着眼睛就可以很顺利开发好.现在半周下来(五一结束开始到今天)完成了差不多所有的界面,网络请求部分还跟服务端兄弟耗 ...

  8. LeetCode第五天

    leetcode 第五天 2018年1月6日 22.(566) Reshape the Matrix JAVA class Solution { public int[][] matrixReshap ...

  9. ACdream 1031 Cut

    题意:给定一棵树,删除一些边,让整棵树被分成多个节点数为偶数的联通块,且联通块尽量多. 思路:如果出现连通且节点数为偶数的立即删除这个点与它父节点之间的边,尽量删除即可,因为题目说了保证n为偶数,删了 ...

  10. 记录一个 spring cloud 配置中心的坑,命令行端口参数无效,被覆盖,编码集问题无法读取文件等.

    spring cloud 配置中心 结合GIT , 可以运行时更新配置文件.发送指令让应用重新读取配置文件. 最近在测试服务器实现了一套,结果CPU 实用率暴增,使用docker compose启动 ...