用Java结合SAX 2.0 解析XML文档

原创 2003年01月20日 09:51:00

/*
自从XML真正形成以来(我认为是Org.W3C组织发布XML标准时开始),XML得到了很快的发展,
 很多厂商都有推出了自己的XML解析器,如Apache的xalan,IBM的xerces,sun的JDOM等,不过这些都是在
 基于JAXP(java API for XML processing)的,从JDK 1.4.0开始的后续j2sdk里都附加了JAXP,这给开发人员
 带来了很大的方便,这使得我们在处理一般的XML功能上的问题时不再需要去用第三方的XML处理器了.
 随着XML的迅速发展,SAX也从1.0到了现在的2.0了(还是能够和1.0兼容),结构上有了一些较大的变化.

 DOM(document object model)每次读取XML节点时都要把它load到内存里来,在文档很大时,就显得很慢了,SAX(simple API for XML),是一个XML解析器的接口,它比DOM更低级一些,它是一种基于事件和回调模式的XML处理方式, 因此在解析速度上DOM是没法比的(当要解析的XML文档很大的时更是如此).那么在SAX中事件响应(event)是什么呢 ? 我个人认为这一点和Swing,AWT中的事件义有点相似的,都有是指在触发某些特定的行为时所做的处理,如:mouse 的click事件等到. 这里则是指碰到特定的XML节点的所做的处理,如文档开始(startDocument),文档结束(endDocument),元素开始(startElement)等很多,大家看一下SAX的API中的方法名字就知道有哪些事件了,基本上可以做到见文知义的.在只想分析XML内容(只读),要求高性能,灵活性 能够定位错误信息(SAX能够定位错误的行列位置)时,最好用SAX来做. 一般情况下SAX是按下面的原理去使用的:
  <1>设置事件处理器(SAX 1.0是使用一个通过继承HandlerBase类的实例来设置
的,SAX 2.0则是继承DefaultHandler的,还有用XMLReader方式的,在原理上没有很大的区别)
  <2>载入要解析的内容
  <3>在需要解析的事件方法里(具体参见SAX API文档)加入自己的控制逻辑.
  <4>重复<3>直到解析完为止.                
 
 在这里我自己写了一个描述电影海报信息的XML文件(file.xml),用SAX2.0写了一个很简单的XML内容阅读器来解析它, 和大家交流一下自己的心得.程序在我的机器上经过了测试的(OS: win2k Advanced Server(English version),
 Intel pentium CPU, 256M RAM)
*/

import org.w3c.dom.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;

class MyXMLReader extends DefaultHandler
{  
 //Fields
 private int index;
 private Locator locator;

 //Constructor
 public MyXMLReader(){
  super(); //it must be done !
 }

 //nain method
 public static void main(String[] args){
  try{   
     
SAXParserFactory sf  = SAXParserFactory.newInstance();
      SAXParser sp = sf.newSAXParser();
      MyXMLReader reader = new MyXMLReader();
      sp.parse(new InputSource("film.xml"),reader);
  }
  catch(Exception e){
   e.printStackTrace();
  }
 } 

 //Response the startDocument event
 public void startDocument() {
  System.out.println("/n********************************* (: 元旦电影海报 :) ***********************************/n");
 }  

//Response the startElement event
 public void startElement(String uri, String localName, String qName, Attributes attrs){  
  if( qName.equalsIgnoreCase("film") ){   
   index ++;   
   int attrCount = attrs.getLength();
   for( int i = 0; i < attrCount; i ++ ){
    String attrName = attrs.getQName(i);
    if( attrName.equalsIgnoreCase("name") ){
     System.out.println("/t第" + index + "场,片名:<<" +  attrs.getValue(i) + ">>");
    }
    if( attrName.equalsIgnoreCase("price") ){
     System.out.println("/t票价:" + attrs.getValue(i) );     
    }
    if( attrName.equalsIgnoreCase("station") ){
     System.out.println("/t放映地点:" + attrs.getValue(i) );     
    }
    if( attrName.equalsIgnoreCase("time") ){
     System.out.println("/t放映时间:" + attrs.getValue(i) );
    }
    if( attrName.equalsIgnoreCase("describtion") ){
     System.out.println("/t影片简介:" + attrs.getValue(i) );
    }
    System.out.println();
  }
 }

 //Response the endDocument event
 public void endDocument(){
  System.out.println("/t/t/t/t/t/t/t------ 共有" + index + "场电影要放映");  
 }

 //Response the endElement event
 public void endElement(String uri, String localName, String qName){
     //add your codes if neccessary ...
 }

 //Print the fata error information
 public void fatalError(SAXParseException e){
  System.out.println("/nFatal error information -->");
  System.out.println("/t" + e.getMessage());
  System.out.println("/tAt line " + locator.getLineNumber() +
                  ",column " + locator.getColumnNumber());
 }
 
 //Print the usual error information
 public void error(SAXParseException e){
  System.out.println("/nUsual error information -->");  
  System.out.println("/t" + e.getMessage());
  System.out.println("/tAt line " + locator.getLineNumber() +
                  ",column " + locator.getColumnNumber());
 }
 
 //Print the warning information
 public void warning(SAXParseException e){
  System.out.println("/nWarning information -->");    
  System.out.println("/t" + e.getMessage());  
  System.out.println("/tAt line " + locator.getLineNumber() +
                  ",column " + locator.getColumnNumber());
 }

 //Store the error locator object
 public void setDocumentLocator(Locator lct){
  locator = lct;
 }

}//End class MyXMLReader

附: film.xml完全的内容:

<?xml version="1.0" encoding="GB2312"?>
   <!-- 2003年元月1号长沙市各大影院落放映列表 -->
   <common city="ChangSha China" date="01/01/2003">
     <film name="英雄" price="30" station="田汉大剧场" time="19:00"
        describtion="国产最新大片,张艺谋导演,梁朝伟,张曼玉,李连杰等众多大明星主演">
  </film>
  <film name="无间道" price="20" station="长沙市演艺中心" time="15:00"
        describtion="韩国大片">
  </film>
  <film name="武士" price="20" station="湖南省电影院" time="17:00"
        describtion="韩国大片,有点像英雄">
  </film>  
  <film name="长排山之战" price="15" station="长沙市电影超市A1厅" time="19:00"
        describtion="反映对越自卫反击战时期中国军人的故事片">
      </film>
  <film name="高山下的花环" price="15" station="长沙市电影超市A2厅" time="19:00"
        describtion="反映对越自卫反击战时期中国军人的故事片">
  </film>  
    <film name="这里的黎明静悄悄" price="15" station="长沙市电影超市A3厅" time="19:00"
        describtion="反映对越自卫反击战时期中国军人的故事片">
  </film>
  <film name="子夜" price="15" station="长沙市电影超市B1厅" time="19:00"
        describtion="反映对越自卫反击战时期中国军人的故事片">
  </film>
  </common>

 

Java解析xml文档之SAX解析

sax解析是一种边读边解析,仅向前读取,不能修改,用来读。sax创建XMLReader三步:SAXParserFactory factory = SAXParserFactory.newInstanc...
  • new___Smile
  • new___Smile
  • 2016年07月16日 00:59
  • 4155

用Java结合SAX 2.0 解析XML文档

function StorePage(){d=document;t=d.selection?(d.selection.type!=None?d.selection.createRange().text...
  • yuanchao3333
  • yuanchao3333
  • 2008年04月10日 13:19
  • 381

使用SAX方式解析XML文件

SAX方式解析XML的步骤: 1、通过SAXParseFactory的静态newInstance()方法获取SAXParseFactory实例factory 2、SAXParseFactory实例的n...
  • u014042146
  • u014042146
  • 2015年09月15日 18:16
  • 915

sax和dom在解析xml文档时有什么区别

当你需要处理XML文档时,你的首要选择是使用DOM(文档对象模型)还是使用SAX(用于XML的简单API),即当前使用的两个主要的XML API。你可以使用任何一种(或者在同一时间使用两种)来处理XM...
  • zhupengqq
  • zhupengqq
  • 2016年04月18日 18:31
  • 1291

理解SAX解析xml的工作原理

摘要: SAX以事件流来解析xml,边读边触发事件函数完成解析,适用于较大XML; DOM加载整个xml文件,最终在内存中创建一个DOM树,适合小XML文件,操作DOM节点比较简便。 dom比较好理解...
  • u011854789
  • u011854789
  • 2017年01月02日 16:17
  • 1122

Java&Xml教程(五)使用SAX方式解析XML文件

Java SAX解析机制为我们提供了一系列的API来处理XML文件,SAX解析和DOM解析方式不太一样,它并不是將XML文件内容一次性全部加载,而是连续的部分加载。javax.xml.parsers....
  • Rongbo_J
  • Rongbo_J
  • 2015年12月13日 15:09
  • 1577

Java解析xml——SAX解析

一、Dom解析 VS SAX解析 Dom解析是将整个xml文件加载到内存中,然后再进行相关的操作。 SAX解析是依次读取xml文件的内容,逐个解析。 二、SAX解析实例 books.xml: ...
  • u011024652
  • u011024652
  • 2016年05月27日 13:58
  • 489

【Java编程】SAX XML Parser解析、生成XML文件

1、优缺点 优点: SAX 从根本上解决了 DOM 在解析 XML 文档时产生的占用大量资源的问题。其实现是通过类似于流解析的技术,通读整个 XML 文档树,通过事件处理器来响应程序员对于 XML 数...
  • a13429921973
  • a13429921973
  • 2014年05月01日 22:43
  • 4271

使用SAX解析将xml的文件内容结构保存到java对象中

在Java使用Sax解析xml文件中,我们介绍了如何用SAX解析xml文件,接下来我们继续学习如何将一个xml文件的内容结构保存到一个java实例对象中 一、xml文件如下 计...
  • kingsonyoung
  • kingsonyoung
  • 2016年07月22日 15:17
  • 1483

java--通过sax方式解析xml文件的简单实例

1.重写的继承自DefaultHandler的方法,部分代码如下: @Override public void startElement(String uri, String localName,...
  • a1491758730
  • a1491758730
  • 2015年10月18日 09:36
  • 779
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用Java结合SAX 2.0 解析XML文档
举报原因:
原因补充:

(最多只允许输入30个字)