一,为什么要用它

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. 洛谷 [P2661] 信息传递

    求有向图的权值为一的最小环 并查集做法 维护一个dis[],表示i号元素到fa[i]的距离. 对于输入的每两个点u,v,询问这两个点的fa[]是否相同,如果相同就成环,维护最小值,mi=min(mi, ...

  2. CF487 E. Tourists [点双连通分量 树链剖分 割点]

    E. Tourists 题意: 无向连通图 C a w: 表示 a 城市的纪念品售价变成 w. A a b: 表示有一个游客要从 a 城市到 b 城市,你要回答在所有他的旅行路径中最低售价的最低可能值 ...

  3. 在.NetCore中使用Myrmec检测文件真实格式

    Myrmec 是什么? Myrmec 是一个用于检测文件格式的库,Myrmec不同于其它库或者手写检测代码,Myrmec不依赖文件扩展名(在实际使用中,你的用户很可能使用虚假的扩展名欺骗你的应用程序) ...

  4. VScode离线安装插件

    VScode离线插件的转移 需求:换台电脑用VScode 找到插件安装路径 在本地找.vscode的文件夹,里面的extensions文件夹里都是下载的插件 复制发给其他电脑 在vscode首选项-- ...

  5. 深入理解vue

    一 理解vue的核心理念 使用vue会让人感到身心愉悦,它同时具备angular和react的优点,轻量级,api简单,文档齐全,简单强大,麻雀虽小五脏俱全. 倘若用一句话来概括vue,那么我首先想到 ...

  6. 大型互联网公司Java开发岗位面试题归类!

    ​一.Java基础 1. String类为什么是final的. 2. HashMap的源码,实现原理,底层结构. 3. 说说你知道的几个Java集合类:list.set.queue.map实现类咯.. ...

  7. 洛谷P1854 花店橱窗布置 分析+题解代码

    洛谷P1854 花店橱窗布置 分析+题解代码 蒟蒻的第一道提高+/省选-,纪念一下. 题目描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定 ...

  8. mongodb 配置均衡器的运行窗口

    当系统的数据量增长不是太快的时候,考虑到数据迁移会降低系统性能,可以配置均衡器在只在特定时间段运行.详细的配置步骤如下: 连接到任意的mongos服务器,并通过安全认证(如果有认证的话). 切换到co ...

  9. 用yii2给app写接口(上)

    Yii2如何实现RESTful风格的API 1.建立单独的应用程序 为了增加程序的可维护性,易操作性,我们选择新建一套应用程序,这也是为了和前台应用.后台应用区分开操作.有些人要嚷嚷了,为啥非得单独搞 ...

  10. OSI网络模型

    OSI中的层 功能 TCP/IP协议族 应用层         文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 表示层         数 ...