zoukankan      html  css  js  c++  java
  • XML解析--SAX解析

    SAX解析是基于事件的解析方式,Sun公司提供的。内置在jdk中。org.xml.sax。

    SAX解析原理:

    加载一点,读取一点,处理一点。对内存要求比较低。

    核心API:

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

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

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

    参数二: DefaultHandler: SAX事件处理程序。使用DefaultHandler的子类,并重写以下方法来完成xml的解析。

      void startDocument()  :  在读到文档开始时调用

      void endDocument()  :在读到文档结束时调用

      void startElement(String uri, String localName, String qName, Attributes attributes)  :读到开始标签时调用                                 

      void endElement(String uri, String localName, String qName)   :读到结束标签时调用

      void characters(char[] ch, int start, int length)  : 读到文本内容时调用

    代码示例:

    使用sax解析把 xml文档封装成对象

    contact.xml文档如下:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <contactList>
     3     <contact id="001">
     4         <name>张三</name>
     5         <age>20</age>
     6         <phone>15215413777</phone>
     7         <email>play@126.com</email>
     8         <qq>435345345</qq>
     9     </contact>
    10     <contact id="002">
    11         <name>李四</name>
    12         <age>21</age>
    13         <phone>15215413888</phone>
    14         <email>play@126.com</email>
    15         <qq>3234234234</qq>
    16     </contact>
    17 </contactList>
    View Code

    contact.java对象文件如下:

     1 public class Contact {
     2     private String id;
     3     private String name;
     4     private String age;
     5     private String phone;
     6     private String email;
     7     private String qq;
     8     public String getId() {
     9         return id;
    10     }
    11     public void setId(String id) {
    12         this.id = id;
    13     }
    14     public String getName() {
    15         return name;
    16     }
    17     public void setName(String name) {
    18         this.name = name;
    19     }
    20     public String getAge() {
    21         return age;
    22     }
    23     public void setAge(String age) {
    24         this.age = age;
    25     }
    26     public String getPhone() {
    27         return phone;
    28     }
    29     public void setPhone(String phone) {
    30         this.phone = phone;
    31     }
    32     public String getEmail() {
    33         return email;
    34     }
    35     public void setEmail(String email) {
    36         this.email = email;
    37     }
    38     public String getQq() {
    39         return qq;
    40     }
    41     public void setQq(String qq) {
    42         this.qq = qq;
    43     }
    44     @Override
    45     public String toString() {
    46         return "Contact [age=" + age + ", email=" + email + ", id=" + id
    47                 + ", name=" + name + ", phone=" + phone + ", qq=" + qq + "]";
    48     }
    49     
    50 }
    View Code

    DefaultHandler的子类文件如下:

     1 public class MyDefaultHandler3 extends DefaultHandler {
     2     //存储所有联系人对象
     3     private List<Contact> list = new ArrayList<Contact>();
     4     
     5     public List<Contact> getList(){
     6         return list;
     7     }
     8     //保存一个联系人信息
     9     private Contact contact;
    10     /**
    11      * 思路: 
    12      *     1)创建Contact对象
    13      *  2)把每个contact标签内容存入到Contact对象
    14      *  3)把Contact对象放入List中
    15      */
    16     //用于临时存储当前读到的标签名
    17     private String curTag;
    18 
    19     @Override
    20     public void startElement(String uri, String localName, String qName,
    21             Attributes attributes) throws SAXException {
    22         curTag = qName;
    23         //读取到contact的开始标签创建Contact对象
    24         if("contact".equals(qName)){
    25             contact = new Contact();
    26             
    27             //设置id值
    28             contact.setId(attributes.getValue("id"));
    29         }
    30     }
    31     
    32     @Override
    33     public void characters(char[] ch, int start, int length)
    34             throws SAXException {
    35         //当前文本内容
    36         String content = new String(ch,start,length);
    37         
    38         if("name".equals(curTag)){
    39             contact.setName(content);
    40         }
    41         
    42         if("age".equals(curTag)){
    43             contact.setAge(content);
    44         }
    45         
    46         if("phone".equals(curTag)){
    47             contact.setPhone(content);
    48         }
    49         
    50         if("email".equals(curTag)){
    51             contact.setEmail(content);
    52         }
    53         
    54         if("qq".equals(curTag)){
    55             contact.setQq(content);
    56         }
    57     }
    58     
    59     @Override
    60     public void endElement(String uri, String localName, String qName)
    61             throws SAXException {
    62         //设置空时为了避免空格换行设置到对象的属性中
    63         curTag = null;
    64         //读到contact的结束标签放入List中
    65         if("contact".equals(qName)){
    66             list.add(contact);
    67         }
    68     }
    69 }
    View Code

    SAX解析文件如下:

    1 public static void main(String[] args)throws Exception {
    2         SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
    3         MyDefaultHandler3 handler = new MyDefaultHandler3();
    4         parser.parse(new File("./src/contact.xml"), handler);
    5         List<Contact> list = handler.getList();
    6         for (Contact contact : list) {
    7             System.out.println(contact);
    8         }
    9     }
    View Code

    Dom解析和SAX解析对比:

    1)原理上:

    Dom:一次性加载xml文档,不适合大容量的文件读取。

    SAX:加载一点,读取一点,处理一点。适合大容量文件的读取。

    2)操作上:

    Dom:可以任意的进行增删改查。

    SAX:只能读取。

    3)读取顺序上:

    Dom:任意读取任何位置的数据,并且可以往回读。

    SAX:从上往下一次读取。

    4)实现方式上:

    Dom:面向对象的编程方法(Node,Element,Attribute)。

    SAX: 基于事件的编程方法。

  • 相关阅读:
    【C++】Lambda表达式
    使用velodyne16线激光雷达跑loam-velodyne
    IMU(LPMS-B2) ROS下使用教程
    【C++】关键字inline
    OpenCV中feature2D——BFMatcher和FlannBasedMatcher
    CUDA 编程
    进程(process)和线程(thread)的区别
    【C++】源自指针的报错
    【C++】如何接收函数return返回来的数组元素
    远程访问服务器tensorboard
  • 原文地址:https://www.cnblogs.com/nicker/p/6437624.html
Copyright © 2011-2022 走看看