java与xml之SAX解析XML文档

来源:互联网 发布:java string contact 编辑:程序博客网 时间:2024/05/24 02:15

SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX还比它的替代者DOM快许多。

    选择DOM还是选择SAX? 对于需要自己编写代码来处理XML文档的开发人员来说, 选择DOM还是SAX解析模型是一个非常重要的设计决策。
DOM采用建立树形结构的方式访问XML文档,而SAX采用的事件模型。

    DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。用DOM解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用
navigation 
APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。

    
SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag.特别是当开发人员只需要处理文档中所包含的部分数据时,SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。


优点:不用事先调入整个文档,占用资源少;SAX解析器代码比DOM解析器代码小,适于Applet,下载
缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;使用场合:Applet;只需XML文档的少量内容,很少回头访问;机器内存少;


这里,我们准备一个xml文档,内容及结构如下:

[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8" standalone="no"?>  
  2. <books>  
  3. <book id="1">  
  4. <name></name>  
  5. <price>50</price>  
  6. <author>作者0</author>  
  7. </book>  
  8. <book id="2">  
  9. <name>书本1</name>  
  10. <price>100</price>  
  11. <author>作者1</author>  
  12. </book>  
  13. <book id="3">  
  14. <name>书本2</name>  
  15. <price>150</price>  
  16. <author>作者2</author>  
  17. </book>  
  18. </books>  

解析代码如下:

[java] view plain copy
  1. package com.mdy.xml.xmldemo;  
  2.   
  3. import java.io.FileInputStream;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.IOException;  
  6.   
  7. import javax.xml.parsers.ParserConfigurationException;  
  8. import javax.xml.parsers.SAXParser;  
  9. import javax.xml.parsers.SAXParserFactory;  
  10.   
  11. import org.xml.sax.Attributes;  
  12. import org.xml.sax.SAXException;  
  13. import org.xml.sax.helpers.DefaultHandler;  
  14.   
  15. public class SAXDemo{  
  16.   
  17.     public SAXDemo() {  
  18.         super();  
  19.     }  
  20.       
  21.     public static void main(String[] args) {  
  22.         SAXDemo saxDemo = new SAXDemo();  
  23.         saxDemo.parserXML("SAXDemo.xml");  
  24.     }  
  25.   
  26.   
  27.     public void parserXML(String fileName) {  
  28.         SAXParserFactory saxFactory = SAXParserFactory.newInstance();  
  29.         try {  
  30.             SAXParser saxParse = saxFactory.newSAXParser();  
  31.             saxParse.parse(new FileInputStream(fileName), new MySAXHandle());  
  32.         } catch (ParserConfigurationException e) {  
  33.             e.printStackTrace();  
  34.         } catch (SAXException e) {  
  35.             e.printStackTrace();  
  36.         } catch (FileNotFoundException e) {  
  37.             e.printStackTrace();  
  38.         } catch (IOException e) {  
  39.             e.printStackTrace();  
  40.         }  
  41.     }  
  42.       
  43.     class MySAXHandle extends DefaultHandler {  
  44.           
  45.         private String preTag;  
  46.         @Override  
  47.         public void startDocument() throws SAXException {  
  48.             System.out.println("开始解析文档------");  
  49.         }  
  50.   
  51.         @Override  
  52.         public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {  
  53.             if("books".equals(qName)){  
  54.                 System.out.println("打印根节点:"+qName);  
  55.             }else{  
  56.                 System.out.print(qName);  
  57.             }  
  58.             preTag = qName;  
  59.             for(int i=0;i<attributes.getLength();i++){  
  60.                 System.out.println("属性:"+attributes.getQName(i)+"---> 值:"+attributes.getValue(i));  
  61.             }  
  62.         }  
  63.   
  64.         @Override  
  65.         public void endElement(String uri, String localName, String qName)throws SAXException {  
  66.             //System.out.println("结束解析元素:"+qName);  
  67.             preTag = null;  
  68.               
  69.         }  
  70.   
  71.         @Override  
  72.         public void characters(char ch[], int start, int length)throws SAXException {  
  73.             if(preTag != null){  
  74.                 String content =  new String(ch, start, length);  
  75.                 if(content != null && !"".equals(content.replace("\r\n""").trim())){  
  76.                     System.out.println(":"+content);  
  77.                 }  
  78.             }  
  79.         }  
  80.           
  81.         @Override  
  82.         public void endDocument() throws SAXException {  
  83.             System.out.println("结束解析文档------");  
  84.         }  
  85.   
  86.     }  
  87.       
  88.       
  89. }  

运行结果:

[plain] view plain copy
  1. 开始解析文档------  
  2. 打印根节点:books  
  3. book属性:id---> 值:1  
  4. nameprice:50  
  5. author:作者0  
  6. book属性:id---> 值:2  
  7. name:书本1  
  8. price:100  
  9. author:作者1  
  10. book属性:id---> 值:3  
  11. name:书本2  
  12. price:150  
  13. author:作者2  
  14. 结束解析文档------  
原创粉丝点击