您的位置:首页 > 编程语言 > Java开发

java基础74 XML解析中的SAX解析相关知识点(网页知识)

2018-09-02 23:48 856 查看

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

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: