Java XML解析之SAX解析
来源:互联网 发布:c语言 用法 编辑:程序博客网 时间:2024/06/01 09:04
SAX(Simple API for XML)解析:基于事件流的解析。
特点:速度快,文档大小无限制
只读,不能随机访问,不好查找节点
java包:org.xml.sax/org.xml.sax.helpers
常用接口/类:
XMLReader
ContentHandler
DTDHandler
EntityResolver
ErrorHandler
DefaultHandler
DefaultHandler事件举例:
startDocument():
startElement(String uri, String localName, String qName,Attributes attributes)
characters(char[] ch, int start, int length)
endElement(String uri, String localName, String qName)
SAX在读取一行XML文档数据后,就会给感兴趣的用户一个通知!例如当SAX读取到一个元素的开始时,会通知用户当前解析到一个元素的开始标签。而用户可以在整个解析的过程中完成自己的业务逻辑,当SAX解析结束,不会保存任何XML文档的数据。
优点:使用SAX,不会占用大量内存来保存XML文档数据,效率也高。
缺点:当解析到一个元素时,上一个元素的信息已经丢弃,也就是说没有保存元素与元素之间的结构关系,这也大大限制了SAX的使用范围。如果只是想查询XML文档中的数据,那么使用SAX是最佳选择!
编程步骤:
1.准备一个xml文件,和DOM解析一样,movies.xml:
<?xml version="1.0" encoding="UTF-8"?><Movies> <Movie id="1"> <name>愤怒的小鸟</name> <type>animation</type> <year>2016</year> </Movie> <Movie id="2"> <name>叶问</name> <type>action</type> <language>chinese</language> </Movie></Movies>2.创建SAXParserFactory对象
SAXParserFactory spf=SAXParserFactory.newInstance();
3.创建SAXParser对象
SAXParser saxParser=spf.newSAXParser();
4.解析处理xml文件
saxParser.parse("movies.xml", new MyHandler());
5.然后会在MyHandler处理xml文件
这个类继承了DefaultHandler,下面开始讲解步骤:
(1)开始xml解析:
@Overridepublic void startDocument() throws SAXException {// TODO Auto-generated method stubSystem.out.println("开始解析");movielist=new ArrayList<Movie>();}
(2)开始解析一个元素:
@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {// TODO Auto-generated method stubif(qName.equals("Movie")){movie=new Movie();count++;System.out.println("正在解析第"+count+"部电影");for(int i=0;i<attributes.getLength();i++){System.out.println("属性名:"+attributes.getQName(i));System.out.println("属性值:"+attributes.getValue(i));if(attributes.getQName(i).equals("id")){movie.setId(attributes.getValue(i));}}}}(3)开始解析每一部电影的文本内容:
@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {// TODO Auto-generated method stubvalue=new String(ch,start,length);if(!value.trim().equals("")){//去除空格之后不是空字符串System.out.println("节点值:"+value); }}
(4)结束解析文档:
@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {// TODO Auto-generated method stubif(qName.equals("Movie")){movielist.add(movie);movie=null;System.out.println("第"+count+"部电影解析结束");}if(qName.equals("year")){movie.setYear(value);}else if (qName.equals("name")) { movie.setName(value);}else if (qName.equals("language")) {movie.setLanguage(value);}else if (qName.equals("type")) {movie.setYear(value);}}
(6)结束xml解析:
@Overridepublic void endDocument() throws SAXException {// TODO Auto-generated method stubSystem.out.println("结束解析");}
6.MyHandler完整代码:
public class MyHandler extends DefaultHandler{private String value;private int count=0;private Movie movie;private ArrayList<Movie>movielist;@Overridepublic void startDocument() throws SAXException {// TODO Auto-generated method stubSystem.out.println("开始解析");movielist=new ArrayList<Movie>();}@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {// TODO Auto-generated method stubif(qName.equals("Movie")){movie=new Movie();count++;System.out.println("正在解析第"+count+"部电影");for(int i=0;i<attributes.getLength();i++){System.out.println("属性名:"+attributes.getQName(i));System.out.println("属性值:"+attributes.getValue(i));if(attributes.getQName(i).equals("id")){movie.setId(attributes.getValue(i));}}}}@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {// TODO Auto-generated method stubvalue=new String(ch,start,length);if(!value.trim().equals("")){//去除空格之后不是空字符串System.out.println("节点值:"+value); }}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {// TODO Auto-generated method stubif(qName.equals("Movie")){movielist.add(movie);movie=null;System.out.println("第"+count+"部电影解析结束");}if(qName.equals("year")){movie.setYear(value);}else if (qName.equals("name")) { movie.setName(value);}else if (qName.equals("language")) {movie.setLanguage(value);}else if (qName.equals("type")) {movie.setYear(value);}}@Overridepublic void endDocument() throws SAXException {// TODO Auto-generated method stubSystem.out.println("结束解析");}}
7.Sax:
public class Sax {public static void main(String[] args) {//1.创建SAXParserFactory对象SAXParserFactory spf=SAXParserFactory.newInstance();try {//2.创建SAXParser对象SAXParser saxParser=spf.newSAXParser();saxParser.parse("movies.xml", new MyHandler());} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
8.Movie:
public class Movie {private String id,name,type,language,year;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getType() {return type;}public void setType(String type) {this.type = type;}public String getLanguage() {return language;}public void setLanguage(String language) {this.language = language;}public String getYear() {return year;}public void setYear(String year) {this.year = year;}@Overridepublic String toString() {// TODO Auto-generated method stubreturn "id:"+id+" "+"name:"+name+" "+"type:"+type+" "+"language:"+language+" "+"year:"+year;}}
效果图:
- java之SAX解析XML
- java xml解析之SAX
- java简单解析xml之SAX解析
- Java 解析 XML 文件之 SAX 解析
- Java XML解析之SAX解析
- Java解析xml文档之SAX解析
- 解析xml之--SAX
- 解析xml之--SAX
- 解析xml之--SAX
- XML解析之SAX
- XML 解析之SAX
- XML解析之SAX
- 【xml之SAX解析】
- XML解析之SAX
- 解析XML之SAX
- xml之SAX解析
- xml之sax解析
- xml解析之sax
- Codevs 1702 素数判定 2(Fermat定理)
- 并查集
- LeetCode 98. Validate Binary Search Tree
- druid-1.0.21源代码导入eclipse工程遇到的问题
- sql 查询表的所有列信息
- Java XML解析之SAX解析
- asp.net中,用Ajax实现客户端调用服务器端的函数(PageMethods)
- 使用CXF框架开发WebService客户端
- TabBarController简单介绍
- 关于数组的新理解
- linux命令之gdb
- Java Web学习(3):Win7 64位操作系统搭建Java Web开发环境
- 新浪云-使用 PHP-Resque 实现后台任务
- TP3.2.3 Dialog封装