一,为什么要用它

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 4827: [Hnoi2017]礼物 [fft]

    4827: [Hnoi2017]礼物 题意:略 以前做的了 化一化式子就是一个卷积和一些常数项 我记着确定调整值还要求一下导... #include <iostream> #include ...

  2. 自用最小生成树模板(基于Kruskal)

    200ms的板子,我尽力了,以我自己的能力没法再快了... 基于Kruskal的做法,跑了200ms,以我自己的能力没办法再快了,不过翻了几页评测列表发现我是最快的...我觉得应该会有更快的方法.想法 ...

  3. Azure ARM (21) Azure订阅的两种管理模式

    <Windows Azure Platform 系列文章目录> 熟悉Azure平台的读者都知道,Microsoft Azure服务管理,分为三个层次: 1.企业服务合同 (Enterpri ...

  4. 2018/2/5 ELK技术栈之ElasticSearch学习笔记

    npm config set registry https://registry.npm.taobao.org npm config get registry 支持跨域访问http.cors.enab ...

  5. 像我这样优雅地进行Spring整合MongoDB

    本文重点是要将mongodb与spring整合到项目中去,在实践中发现问题,追踪问题,然后解决问题. 一.准备 Maven.Spring(spring-data-mongodb) spring Dat ...

  6. CSS常用属性计算原理

    absolute: left.right/top.bottom 的百分比值分别根据父元素的 wdith / height 计算 margin: top /right / bottom/ left 的百 ...

  7. Windows 系统下安装 dig 命令

    dig是一个Linux下用来DNS查询信息的小工具,dig全称是Domain Information Groper,与nslookup类似,但比nslookup功能更强大.Windows只有nsloo ...

  8. vs code 使用git

    1.下载git https://git-scm.com/ 2. git 全局设置 git config --global user.name "xxxx" git config - ...

  9. 腾讯云微计算实践:从Serverless说起,谈谈边缘计算的未来

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:黄文俊,腾讯云高级产品经理,曾经历过企业级存储.企业级容器平台等产品的架构与开发,对容器.微服务.无服务器.DevOps等都有浓厚兴趣. ...

  10. Appium适配Android7.0以上版本

    Appium适配Android7.0以上版本 测试机型: 华为荣耀V9 安卓版本: Android7.0 appium版本: 1.65 说明: 公司新采购了一批安卓机器,拿了其中一台华为荣耀V9跑之前 ...