Dev_Nick

导航

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: 基于事件的编程方法。

 

posted on 2017-02-24 11:02  Dev_Nick  阅读(201)  评论(0编辑  收藏  举报