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