博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用SAX解析XML文件
阅读量:5879 次
发布时间:2019-06-19

本文共 7002 字,大约阅读时间需要 23 分钟。

SAX这是Simple API for XML缩写,它不是由引起W3C拟议标准正式。尽管如此,使用SAX很少几个,点儿全部的XML解析器都会支持它。

     与DOM比較而言,SAX是一种轻量型的方法。

我们知道,在处理DOM的时候,我们须要读入整个的XML文档。然后在内存中创建DOM树,生成DOM树上的每一个Node对象。当文档比較小的时候,这不会造成什么问题,可是一旦文档大起来,处理DOM就会变得相当费时费力。特别是其对于内存的需求,也将是成倍的增长,以至于在某些应用中使用DOM是一件非常不划算的事(比方在applet中)。这时候。一个较好的替代解决方法就是SAX。

     SAX在概念上与DOM全然不同。它不同于DOM的文档驱动,它是事件驱动的,它并不须要读入整个文档,而文档的读入过程也就是SAX的解析过程。

所谓事件驱动。是指一种基于回调(callback)机制的程序执行方法。

     以下对这个xml文件使用sax解析:

    

[html] 
  1. <?

    xml version="1.0" encoding="UTF-8"?>  
  2. <root>  
  3.     <student id="1" group="1">  
  4.         <name>张三</name>  
  5.         <sex></sex>  
  6.         <age>18</age>  
  7.         <email>zhangsan@163.com</email>  
  8.         <birthday>1987-06-08</birthday>  
  9.         <memo>好学生</memo>  
  10.     </student>  
  11.     <student id="2" group="2">  
  12.         <name>李四</name>  
  13.         <sex></sex>  
  14.         <age>18</age>  
  15.         <email>lisi@163.com</email>  
  16.         <birthday>1987-06-08</birthday>  
  17.         <memo>好学生</memo>  
  18.     </student>  
  19.     <student id="3" group="3">  
  20.         <name>小王</name>  
  21.         <sex></sex>  
  22.         <age>18</age>  
  23.         <email>xiaowang@163.com</email>  
  24.         <birthday>1987-06-08</birthday>  
  25.         <memo>好学生</memo>  
  26.     </student>  
  27.     <student id="4" group="4">  
  28.         <name>小张</name>  
  29.         <sex></sex>  
  30.         <age>18</age>  
  31.         <email>xiaozhang@163.com</email>  
  32.         <birthday>1987-06-08</birthday>  
  33.         <memo>好学生</memo>  
  34.     </student>  
  35.     <student id="5" group="5">  
  36.         <name>小明</name>  
  37.         <sex></sex>  
  38.         <age>18</age>  
  39.         <email>xiaoming@163.com</email>  
  40.         <birthday>1987-06-08</birthday>  
  41.         <memo>好学生</memo>  
  42.     </student>  
  43. </root>  

     xml相应的Javabean:

  

public class Student {            private int id;      private int group;      private String name;      private String sex;      private int age;      private String email;      private String memo;      private String birthday;      public int getId() {          return id;      }      public void setId(int id) {          this.id = id;      }      public int getGroup() {          return group;      }      public void setGroup(int group) {          this.group = group;      }      public String getName() {          return name;      }      public void setName(String name) {          this.name = name;      }      public String getSex() {          return sex;      }      public void setSex(String sex) {          this.sex = sex;      }      public int getAge() {          return age;      }      public void setAge(int age) {          this.age = age;      }      public String getEmail() {          return email;      }      public void setEmail(String email) {          this.email = email;      }      public String getMemo() {          return memo;      }      public void setMemo(String memo) {          this.memo = memo;      }      public String getBirthday() {          return birthday;      }      public void setBirthday(String birthday) {          this.birthday = birthday;      }        }

 開始解析:

 

import java.util.ArrayList;  import java.util.List;      import org.xml.sax.Attributes;  import org.xml.sax.SAXException;  import org.xml.sax.helpers.DefaultHandler;        /**   * 功能描写叙述:採用sax方式解析XML
* * @author sxyx2008 * */ public class SaxParseXml extends DefaultHandler{ //存放遍历集合 private List
list; //构建Student对象 private Student student; //用来存放每次遍历后的元素名称(节点名称) private String tagName; public List
getList() { return list; } public void setList(List
list) { this.list = list; } public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } public String getTagName() { return tagName; } public void setTagName(String tagName) { this.tagName = tagName; } //仅仅调用一次 初始化list集合 @Override public void startDocument() throws SAXException { list=new ArrayList
(); } //调用多次 開始解析 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if(qName.equals("student")){ student=new Student(); //获取student节点上的id属性值 student.setId(Integer.parseInt(attributes.getValue(0))); //获取student节点上的group属性值 student.setGroup(Integer.parseInt(attributes.getValue(1))); } this.tagName=qName; } //调用多次 @Override public void endElement(String uri, String localName, String qName) throws SAXException { if(qName.equals("student")){ this.list.add(this.student); } this.tagName=null; } //仅仅调用一次 @Override public void endDocument() throws SAXException { } //调用多次 @Override public void characters(char[] ch, int start, int length) throws SAXException { if(this.tagName!=null){ String date=new String(ch,start,length); if(this.tagName.equals("name")){ this.student.setName(date); } else if(this.tagName.equals("sex")){ this.student.setSex(date); } else if(this.tagName.equals("age")){ this.student.setAge(Integer.parseInt(date)); } else if(this.tagName.equals("email")){ this.student.setEmail(date); } else if(this.tagName.equals("birthday")){ this.student.setBirthday(date); } else if(this.tagName.equals("memo")){ this.student.setMemo(date); } } } }

    測试方法:

 

import javax.xml.parsers.SAXParser;  import javax.xml.parsers.ParserConfigurationException;  import javax.xml.parsers.SAXParserFactory;    import org.xml.sax.SAXException;    import java.io.IOException;  import java.io.InputStream;  import java.util.List;    public class Test {        public static void main(String[] args) {          SAXParser parser = null;          try {              //构建SAXParser              parser = SAXParserFactory.newInstance().newSAXParser();              //实例化  DefaultHandler对象              SaxParseXml parseXml=new SaxParseXml();              //载入资源文件 转化为一个输入流              InputStream stream=SaxParseXml.class.getClassLoader().getResourceAsStream("student.xml");              //调用parse()方法              parser.parse(stream, parseXml);              //遍历结果              List
list=parseXml.getList(); for(Student student:list){ System.out.println("id:"+student.getId()+"\tgroup:"+student.getGroup()+"\tname:"+student.getName()+"\tsex:"+student.getSex()+"\tage:"+student.getAge()+"\temail:"+student.getEmail()+"\tbirthday:"+student.getBirthday()+"\tmemo:"+student.getMemo()); } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }

执行效果:

版权声明:本文博客原创文章,博客,未经同意,不得转载。

你可能感兴趣的文章
Boost在vs2010下的配置
查看>>
一起谈.NET技术,ASP.NET伪静态的实现及伪静态的意义
查看>>
20款绝佳的HTML5应用程序示例
查看>>
string::c_str()、string::c_data()及string与char *的正确转换
查看>>
11G数据的hive初测试
查看>>
如何使用Core Text计算一段文本绘制在屏幕上之后的高度
查看>>
==和equals区别
查看>>
2010技术应用计划
查看>>
XML 节点类型
查看>>
驯服 Tiger: 并发集合 超越 Map、Collection、List 和 Set
查看>>
Winform开发框架之权限管理系统改进的经验总结(3)-系统登录黑白名单的实现...
查看>>
Template Method Design Pattern in Java
查看>>
MVC输出字符串常用四个方式
查看>>
LeetCode – LRU Cache (Java)
查看>>
JavaScript高级程序设计--对象,数组(栈方法,队列方法,重排序方法,迭代方法)...
查看>>
【转】 学习ios(必看经典)牛人40天精通iOS开发的学习方法【2015.12.2
查看>>
在 ASP.NET MVC 中使用异步控制器
查看>>
SQL语句的执行过程
查看>>
Silverlight开发历程—动画(线性动画)
查看>>
详解Linux中Load average负载
查看>>