使用SAX解析XML文件

前端之家收集整理的这篇文章主要介绍了使用SAX解析XML文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

source:http://blog.csdn.net/wangkuifeng0118/article/details/7305068

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] view plain copy
  1. @H_301_29@<?xmlversion="1.0"encoding="UTF-8"?>
  2. @H_301_29@<root>
  3. studentid="1"group="1">
  4. name>张三</sex>age>18email>zhangsan@163.combirthday>1987-06-08memo>好学生studentstudentid="2"group="2">李四>>lisi@163.comstudentid="3"group="3">小王>xiaowang@163.comstudentid="4"group="4">小张>xiaozhang@163.comstudentid="5"group="5">小明>xiaoming@163.com>

xml对应的Javabean:

copy

    @H_301_29@publicclassStudent{
  1. @H_301_29@
  2. @H_301_29@privateintid;
  3. @H_301_29@privateintgroup;
  4. @H_301_29@privateStringname;
  5. @H_301_29@privateStringsex;
  6. @H_301_29@privateintage;
  7. @H_301_29@privateStringemail;
  8. @H_301_29@privateStringmemo;
  9. @H_301_29@privateStringbirthday;
  10. @H_301_29@publicintgetId(){
  11. @H_301_29@returnid;
  12. @H_301_29@}
  13. @H_301_29@publicvoidsetId(intid){
  14. @H_301_29@this.id=id;
  15. @H_301_29@}
  16. @H_301_29@publicintgetGroup(){
  17. @H_301_29@returngroup;
  18. @H_301_29@publicvoidsetGroup(intgroup){
  19. @H_301_29@this.group=group;
  20. @H_301_29@publicStringgetName(){
  21. @H_301_29@returnname;
  22. @H_301_29@publicvoidsetName(Stringname){
  23. @H_301_29@this.name=name;
  24. @H_301_29@publicStringgetSex(){
  25. @H_301_29@returnsex;
  26. @H_301_29@publicvoidsetSex(Stringsex){
  27. @H_301_29@this.sex=sex;
  28. @H_301_29@publicintgetAge(){
  29. @H_301_29@returnage;
  30. @H_301_29@publicvoidsetAge(intage){
  31. @H_301_29@this.age=age;
  32. @H_301_29@publicStringgetEmail(){
  33. @H_301_29@returnemail;
  34. @H_301_29@publicvoidsetEmail(Stringemail){
  35. @H_301_29@this.email=email;
  36. @H_301_29@publicStringgetMemo(){
  37. @H_301_29@returnmemo;
  38. @H_301_29@publicvoidsetMemo(Stringmemo){
  39. @H_301_29@this.memo=memo;
  40. @H_301_29@publicStringgetBirthday(){
  41. @H_301_29@returnbirthday;
  42. @H_301_29@publicvoidsetBirthday(Stringbirthday){
  43. @H_301_29@this.birthday=birthday;
  44. @H_301_29@
  45. @H_301_29@}

开始解析:

copy

    @H_301_29@importjava.util.ArrayList;
  1. @H_301_29@importjava.util.List;
  2. @H_301_29@importorg.xml.sax.Attributes;
  3. @H_301_29@importorg.xml.sax.SAXException;
  4. @H_301_29@importorg.xml.sax.helpers.DefaultHandler;
  5. @H_301_29@/**
  6. @H_301_29@*功能描述:采用sax方式解析XMLbr @H_301_29@*
  7. @H_301_29@*@authorsxyx2008
  8. @H_301_29@*/
  9. @H_301_29@publicclassSaxParseXmlextendsDefaultHandler{
  10. @H_301_29@//存放遍历集合
  11. @H_301_29@privateListStudent>list;
  12. @H_301_29@//构建Student对象
  13. @H_301_29@privateStudentstudent;
  14. @H_301_29@//用来存放每次遍历后的元素名称(节点名称)
  15. @H_301_29@privateStringtagName;
  16. @H_301_29@publicList>getList(){
  17. @H_301_29@returnlist;
  18. @H_301_29@publicvoidsetList(List>list){
  19. @H_301_29@this.list=list;
  20. @H_301_29@publicStudentgetStudent(){
  21. @H_301_29@returnstudent;
  22. @H_301_29@publicvoidsetStudent(Studentstudent){
  23. @H_301_29@this.student=student;
  24. @H_301_29@publicStringgetTagName(){
  25. @H_301_29@returntagName;
  26. @H_301_29@publicvoidsetTagName(StringtagName){
  27. @H_301_29@this.tagName=tagName;
  28. @H_301_29@//只调用一次初始化list集合
  29. @H_301_29@@Override
  30. @H_301_29@publicvoidstartDocument()throwsSAXException{
  31. @H_301_29@list=newArrayList>();
  32. @H_301_29@//调用多次开始解析
  33. @H_301_29@@Override
  34. @H_301_29@publicvoidstartElement(Stringuri,StringlocalName,StringqName,
  35. @H_301_29@Attributesattributes)throwsSAXException{
  36. @H_301_29@if(qName.equals("student")){
  37. @H_301_29@student=newStudent();
  38. @H_301_29@//获取student节点上的id属性
  39. @H_301_29@student.setId(Integer.parseInt(attributes.getValue(0)));
  40. @H_301_29@//获取student节点上的group属性
  41. @H_301_29@student.setGroup(Integer.parseInt(attributes.getValue(1)));
  42. @H_301_29@this.tagName=qName;
  43. @H_301_29@//调用多次
  44. @H_301_29@publicvoidendElement(Stringuri,StringqName)
  45. @H_301_29@throwsSAXException{
  46. @H_301_29@if(qName.equals("student")){
  47. @H_301_29@this.list.add(this.student);
  48. @H_301_29@this.tagName=null;
  49. @H_301_29@//只调用一次
  50. @H_301_29@publicvoidendDocument()throwsSAXException{
  51. @H_301_29@publicvoidcharacters(char[]ch,intstart,intlength)
  52. @H_301_29@if(this.tagName!=null){
  53. @H_301_29@Stringdate=newString(ch,start,length);
  54. @H_301_29@if(this.tagName.equals("name")){
  55. @H_301_29@this.student.setName(date);
  56. @H_301_29@elseif(this.tagName.equals("sex")){
  57. @H_301_29@this.student.setSex(date);
  58. @H_301_29@elseif(this.tagName.equals("age")){
  59. @H_301_29@this.student.setAge(Integer.parseInt(date));
  60. @H_301_29@elseif(this.tagName.equals("email")){
  61. @H_301_29@this.student.setEmail(date);
  62. @H_301_29@elseif(this.tagName.equals("birthday")){
  63. @H_301_29@this.student.setBirthday(date);
  64. @H_301_29@elseif(this.tagName.equals("memo")){
  65. @H_301_29@this.student.setMemo(date);
  66. @H_301_29@}

测试方法

copy

    @H_301_29@importjavax.xml.parsers.SAXParser;
  1. @H_301_29@importjavax.xml.parsers.ParserConfigurationException;
  2. @H_301_29@importjavax.xml.parsers.SAXParserFactory;
  3. @H_301_29@importorg.xml.sax.SAXException;
  4. @H_301_29@importjava.io.IOException;
  5. @H_301_29@importjava.io.InputStream;
  6. @H_301_29@importjava.util.List;
  7. @H_301_29@publicclassTest{
  8. @H_301_29@publicstaticvoidmain(String[]args){
  9. @H_301_29@SAXParserparser=null;
  10. @H_301_29@try{
  11. @H_301_29@//构建SAXParser
  12. @H_301_29@parser=SAXParserFactory.newInstance().newSAXParser();
  13. @H_301_29@//实例化DefaultHandler对象
  14. @H_301_29@SaxParseXmlparseXml=newSaxParseXml();
  15. @H_301_29@//加载资源文件转化为一个输入流
  16. @H_301_29@InputStreamstream=SaxParseXml.class.getClassLoader().getResourceAsStream("student.xml");
  17. @H_301_29@//调用parse()方法
  18. @H_301_29@parser.parse(stream,parseXml);
  19. @H_301_29@//遍历结果
  20. @H_301_29@List>list=parseXml.getList();
  21. @H_301_29@for(Studentstudent:list){
  22. @H_301_29@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());
  23. @H_301_29@}catch(ParserConfigurationExceptione){
  24. @H_301_29@e.printStackTrace();
  25. @H_301_29@}catch(SAXExceptione){
  26. @H_301_29@}catch(IOExceptione){
  27. 运行效果

    猜你在找的XML相关文章