zoukankan      html  css  js  c++  java
  • java基础74 XML解析中的SAX解析相关知识点(网页知识)

    1、SAX解析工具

        SAX解析工具:是Sun公司提供的,内置JDK中。org.xml.sax.*         点击查看: DOM解析相关知识;以及DOM和SAX解析的原理(区别)

    2、SAX解析的核心API

    SAXParser类:用于读取和解析xml文件对象
        parse(File f, DefaultHandler dh)方法----->解析xml文件
            参数一:file:表示读取xml文件
            参数二:DefaultHandler:SAX事件处理程序.使用DefaultHandler的子类 

    DefaultHandler类:
        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):读到文本内容时调用

    3、SAX解析原理和DOM解析原理的区别

    DOM解析原理 SAX解析原理
    1、一次性加载xml文档,不适合大容量的读取文件
    2、DOM解析可以任意进行增删改
    3、DOM解析任意的读取任何位置的数据,甚至往回读
    4、DOM解析面向对象的编程方法(Node,Element,Attribute),java开发者编码比较简单
    1、加载一点,读取一点,处理一点。适合大容量文件读取
    2、SAX解析只能读取
    3、SAX解析只能冲上往下,按顺序的读取,不能回读
    4、SAX解析基于事件的编程方法.java开发编码相对复杂

    4、实例

    例1:用SAX解析读取xml文档

     1 package com.shore.sax;
     2 
     3 import java.io.File;
     4 
     5 import javax.xml.parsers.ParserConfigurationException;
     6 import javax.xml.parsers.SAXParser;
     7 import javax.xml.parsers.SAXParserFactory;
     8 
     9 import org.xml.sax.SAXException;
    10 
    11 public class Demo1 {
    12     public static void main(String[] args) throws Exception, SAXException {
    13         //1.创建SAXParser对象
    14         SAXParser parser=SAXParserFactory.newInstance().newSAXParser();
    15         //2.调用parser方法
    16         /*
    17          * 参数一:xml文档
    18          * 参数二:DefaultHandler的子类
    19          * */
    20         parser.parse(new File("./src/contact.xml"),new MyDefaultHandler());
    21     }
    22 }
     1 package com.shore.sax;
     2 
     3 import org.xml.sax.Attributes;
     4 import org.xml.sax.SAXException;
     5 import org.xml.sax.helpers.DefaultHandler;
     6 
     7 public class MyDefaultHandler extends DefaultHandler {
     8     /*
     9      * 开始文档时调用
    10      * */
    11     @Override
    12     public void startDocument() throws SAXException {
    13         System.out.println("startDocument");
    14     }
    15     /*
    16      * 开始标签时调用
    17      * @param qName:表示开始标签的标签名
    18      * @param attributes:表示开始标签内的包含的属性列表
    19      */
    20     @Override
    21     public void startElement(String uri, String localName, String qName,
    22             Attributes attributes) throws SAXException {
    23         System.out.println("startElement"+"----->"+qName);
    24     }
    25     /*
    26      * 结束标签时调用
    27      * @param qName:结束标签的标签名
    28      * */
    29     @Override
    30     public void endElement(String uri, String localName, String qName)
    31             throws SAXException {
    32         System.out.println("endElement"+"----->"+qName);
    33     }
    34     /*
    35      *读到文本内容时调用
    36      * @param ch:表示当前读取到的所有文本内容
    37      * @param start:表示当前文本内容的开始位置
    38      * @param length:表示当前文本内容长度
    39      */
    40     @Override
    41     public void characters(char[] ch, int start, int length)
    42             throws SAXException {
    43         String content=new String(ch,start,length);//获取文本内容
    44         System.out.println("characters"+"----->"+content);
    45     }
    46     /*
    47      * 结束文档时调用
    48      * */
    49     @Override
    50     public void endDocument() throws SAXException {
    51         System.out.println("endDocument");
    52     }
    53 }

    contact.xml文档

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <contactList>
     3     <contact id="001" sex="男">
     4         <name>张三</name>
     5         <age>18</age>
     6         <phone>15779593710</phone>
     7         <email>872855221@qq.com</email>
     8         <qq>872855221</qq>
     9     </contact>
    10 </contactList>

    结果图

    附录1

     1 package com.shore.code;
     2 
     3 import java.io.File;
     4 import java.io.IOException;
     5 
     6 import javax.xml.parsers.ParserConfigurationException;
     7 import javax.xml.parsers.SAXParser;
     8 import javax.xml.parsers.SAXParserFactory;
     9 
    10 import org.xml.sax.SAXException;
    11 
    12 /**
    13  * @author DSHORE / 2018-9-6
    14  *
    15  */
    16 /*
    17  * 读取contact.xml文件,完整输出文档内容
    18  * */
    19 public class Demo6 {
    20     public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
    21         //1.创建SAXParser
    22         SAXParser parser=SAXParserFactory.newInstance().newSAXParser();
    23         //读取xml1文件
    24         MyDefaultHander2 hander=new MyDefaultHander2();
    25         parser.parse(new File("./src/contact.xml"),hander);
    26         String content=hander.getContent();
    27         System.out.println(content);
    28     }
    29 }

    MyDefaultHander2.java

     1 package com.shore.code;
     2 
     3 import org.xml.sax.Attributes;
     4 import org.xml.sax.SAXException;
     5 import org.xml.sax.helpers.DefaultHandler;
     6 
     7 /**
     8  * @author DSHORE / 2018-9-6
     9  *
    10  */
    11 public class MyDefaultHander2 extends DefaultHandler{
    12     //存储xml文档信息
    13     private StringBuffer sb=new StringBuffer();
    14     
    15     public String getContent(){//作用:把读到的所有内容toString一下(变成字符串的形式)
    16         return sb.toString();
    17     }
    18     //开始标签
    19     @Override
    20     public void startElement(String uri, String localName, String qName,
    21         Attributes attributes) throws SAXException {
    22         sb.append("<"+qName);
    23         if(attributes !=null){
    24             for (int i = 0; i < attributes.getLength(); i++) {
    25                 //得到属性名称
    26                 String attrName=attributes.getQName(i);
    27                 String attrValue=attributes.getValue(i);
    28                 sb.append(" "+attrName+"=""+attrValue+""");
    29             }
    30         }
    31         sb.append(">");
    32     }
    33     //文本内容
    34     @Override
    35     public void characters(char[] ch, int start, int length)
    36             throws SAXException {
    37         String content=new String(ch,start,length);//获取标签中的文本内容
    38         sb.append(content);
    39     }
    40     //结束标签
    41     @Override
    42     public void endElement(String uri, String localName, String qName)
    43             throws SAXException {
    44         sb.append("</"+qName+">");
    45     }
    46 }

    contact.xml文件

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <contactList>
     3     <contact id="001" sex="男">
     4         <name>张三</name>
     5         <age>18</age>
     6         <phone>15779593710</phone>
     7         <email>872855221@qq.com</email>
     8         <qq>872855221</qq>
     9     </contact>
    10     <contact id="002">
    11         <name>李四</name>
    12         <age>20</age>
    13         <phone>1314580</phone>
    14         <email>12580666@qq.com</email>
    15         <qq>832144529</qq>
    16     </contact>
    17 </contactList>

    结果图

    附录2

     1 package com.shore.code;
     2 
     3 import java.io.File;
     4 import java.util.List;
     5 
     6 import javax.xml.parsers.SAXParser;
     7 import javax.xml.parsers.SAXParserFactory;
     8 
     9 import org.xml.sax.SAXException;
    10 
    11 /**
    12  * @author DSHORE / 2018-9-6
    13  *
    14  */
    15 //需求:存储所有联系人信息
    16 public class Demo7 {
    17     public static void main(String[] args) throws Exception, SAXException {
    18         SAXParser parser=SAXParserFactory.newInstance().newSAXParser();
    19         MyDefaultHander3 hander=new MyDefaultHander3();
    20         parser.parse(new File("./src/contact.xml"),hander);
    21         List<Contact> list=hander.getList();
    22                     
    23         for (Contact contact : list) {
    24             System.out.println(contact);
    25         }
    26     }
    27 }

    MyDefaultHander3.java文件

     1 package com.shore.code;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 import org.xml.sax.Attributes;
     7 import org.xml.sax.SAXException;
     8 import org.xml.sax.helpers.DefaultHandler;
     9 
    10 /**
    11  * @author DSHORE / 2018-9-6
    12  *
    13  */
    14 public class MyDefaultHander3 extends DefaultHandler{
    15     //存储所有联系人对象
    16     private List<Contact> list=new ArrayList<Contact>();
    17     private Contact contact;
    18     private String curTag;
    19     
    20     public List<Contact> getList(){
    21         return list;//把设置进去集合里的值 返回给调用者
    22     }
    23     //读到开始标签 调用
    24     @Override
    25     public void startElement(String uri, String localName, String qName,
    26         Attributes attributes) throws SAXException {
    27         curTag=qName;
    28         //System.out.println(curTag);//返回值:xml文件中的所有标签名
    29         if("contact".equals(qName)){
    30             contact=new Contact();    
    31             //设置id
    32             contact.setId(attributes.getValue("id"));
    33         }    
    34     }
    35     //读到文本内容时 调用
    36     @Override
    37     public void characters(char[] ch, int start, int length)
    38             throws SAXException {
    39         //当前文本内容
    40         String content=new String(ch,start, length);
    41         if("name".equals(curTag)){
    42             contact.setName(content);
    43         }
    44         if("age".equals(curTag)){
    45             contact.setAge(content);
    46         }
    47         if("phone".equals(curTag)){
    48             contact.setPhone(content);
    49         }
    50         if("email".equals(curTag)){
    51             contact.setEmail(content);
    52         }
    53         if("qq".equals(curTag)){
    54             contact.setQq(content);
    55         }
    56     }
    57     //读到结束标签时 调用
    58     @Override
    59     public void endElement(String uri, String localName, String qName)
    60             throws SAXException {
    61         curTag = null;//作用:防止xml文件 标签中的值被设置两次(被覆盖)。
    62         /* 解析:如果不要这句代码,输出结果除了id有值,其他标签全部没值。
    63          *       比如contact.xml文件的name标签,读到该标签时,curTag=name,被设置进去的值是“张三”,因为<name>张三</name>标签后面的空白处也是文本内容;
    64          *       (同一行)所以还会往后解析,这时curTag还是等于name,所以空白也被设置进去了(空白文本替换掉了张三);所以name、age、phone、email、qq等标签 全部没值。
    65          **/
    66         if("contact".equals(qName)){
    67             list.add(contact);
    68         }
    69     }
    70 }

    contact.xml文件用的是 和附录1一样

    contact.java文件

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

    结果图

    原创作者:DSHORE

    作者主页:http://www.cnblogs.com/dshore123/

    原文出自:https://www.cnblogs.com/dshore123/p/9576457.html

    欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

  • 相关阅读:
    Mina之session
    进程管理
    Mina之polling
    用户和组ID
    Mina之service
    同步化、同步及异步操作
    高级进程管理
    一般文件I/O用法建议
    有一个图像搜索引擎
    图像处理和识别和机器学习源码
  • 原文地址:https://www.cnblogs.com/dshore123/p/9576457.html
Copyright © 2011-2022 走看看