一,为什么要用它

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. 用 k8s 运行一次性任务 - 每天5分钟玩转 Docker 容器技术(132)

    容器按照持续运行的时间可分为两类:服务类容器和工作类容器. 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等.工作类容器则是一次性任务,比如批处理程序,完成后容 ...

  2. JSP的几种跳转方式的异同

    1 <jsp:foward page="url" /> 服务端跳转,立即跳转,后续语句不会执行: 2 <% response.sendRedirect(" ...

  3. vagrant使用小结

    vagrant使用小结 最近公司用了vagrant的虚拟镜像服务,感觉挺不错的.在此仅记录使用方法. 优点:我们可以通过 Vagrant 封装一个 Linux 的开发环境,分发给团队成员.成员可以在自 ...

  4. centos7 网桥的配置

    centos7下配置网桥,两个步骤:1.新建网桥配置2.修改网卡配置 新建br0 网桥配置 在/etc/sysconfig/network-scripts/目录下新建ifcfg-br0,添加如下配置信 ...

  5. linux 下创建GRE隧道

    其他国家的互联网如同一个孤岛.要想访问国外网站异常的缓慢,甚至被和谐了.可以建立一条隧道来避免这种情况,下面说说GRE隧道如何建立. 1. GRE介绍 GRE隧道是一种IP-over-IP的隧道,是通 ...

  6. windows服务器修改登录密码

    1. 右键我的电脑---管理 2. 计算机管理---本地用户和组--用户 3. 右键administrator用户,选择修改密码 4. 点击继续进入下一步 5. 输入新密码并保存

  7. Filezilla Server日志文件

    Filezilla Server版本:0.9.41. Filezilla Server日志文件在软件安装目录下Logs目录下. 但Filezilla Server默认不开始日志记录,如何开启filez ...

  8. ECharts 高度宽度自适应(转载)

    最近在写一个地图类的应用,用的是echarts的图表,然而一上来就一脸懵逼,如果父级容器的height/width属性设置为百分比的形式,那么echarts就会warning,且不能正常的生成图表.所 ...

  9. SpringMvc Ant通配符的使用

    @RequestMapping使用通配符来对地址进行映射 Ant 的3风格 – ? 匹配文件名中的一个字符 – *  匹配文件名中的任意字符 – ** ** 匹配多重路径 例如:RequestMapp ...

  10. 避免Toast重复弹出

    Toast.matkText才会创建一个新的实例 private Toast toast = null; private void checkToastResult() { if (toast != ...