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>
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 }
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 }
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 }
Dom解析和SAX解析对比:
1)原理上:
Dom:一次性加载xml文档,不适合大容量的文件读取。
SAX:加载一点,读取一点,处理一点。适合大容量文件的读取。
2)操作上:
Dom:可以任意的进行增删改查。
SAX:只能读取。
3)读取顺序上:
Dom:任意读取任何位置的数据,并且可以往回读。
SAX:从上往下一次读取。
4)实现方式上:
Dom:面向对象的编程方法(Node,Element,Attribute)。
SAX: 基于事件的编程方法。