使用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. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <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

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

开始解析:

copy

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

测试方法

copy

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

    猜你在找的XML相关文章