SAX之Java实现学习笔记(一)

原创 2004年01月04日 10:22:00

SAXJava实现学习笔记(一)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

本文假设读者对XML有些了解

 

首先,先给出一个比较基本的处理xml文件的程序。你不必细看,直接跳过即可。需要时可以返回来看。

 

 

Echo01.java

 

import java.io.*;

 

import org.xml.sax.*;

import org.xml.sax.helpers.DefaultHandler;

 

import javax.xml.parsers.SAXParserFactory;

import javax.xml.parsers.ParserConfigurationException;

import javax.xml.parsers.SAXParser;

 

public class Echo01 extends DefaultHandler

{

    StringBuffer textBuffer;

 

    public static void main(String argv[])

    {

        if (argv.length != 1) {

            System.err.println("Usage: cmd filename");

            System.exit(1);

        }

 

        // Use an instance of ourselves as the SAX event handler

        DefaultHandler handler = new Echo01();

 

        // Use the default (non-validating) parser

              SAXParserFactory factory = SAXParserFactory.newInstance();

        try {

            // Set up output stream

            out = new OutputStreamWriter(System.out, "UTF-8");

 

            // Parse the input

            SAXParser saxParser = factory.newSAXParser();

            saxParser.parse( new File(argv[0]), handler);

 

        } catch (Throwable t) {

            t.printStackTrace();

        }

        System.exit(0);

    }

 

    static private Writer  out;

 

    //===========================================================

    // SAX DocumentHandler methods

    //===========================================================

 

    public void startDocument()

    throws SAXException

    {

        emit("<?xml version='1.0' encoding='UTF-8'?>");

        nl();

    }

 

    public void endDocument()

    throws SAXException

    {

        try {

            nl();

            out.flush();

        } catch (IOException e) {

            throw new SAXException("I/O error", e);

        }

    }

 

    public void startElement(String namespaceURI,

                             String sName, // simple name

                             String qName, // qualified name

                             Attributes attrs)

    throws SAXException

    {

        echoText();

              String eName = sName; // element name

        if ("".equals(eName)) eName = qName; // not namespaceAware

        emit("<"+eName);

        if (attrs != null) {

            for (int i = 0; i < attrs.getLength(); i++) {

                String aName = attrs.getLocalName(i); // Attr name

                if ("".equals(aName)) aName = attrs.getQName(i);

                emit(" ");

                emit(aName+"=/""+attrs.getValue(i)+"/"");

                          }

        }

        emit(">");

    }

 

    public void endElement(String namespaceURI,

                           String sName, // simple name

                           String qName  // qualified name

                          )

    throws SAXException

    {

        echoText();

        String eName = sName; // element name

        if ("".equals(eName)) eName = qName; // not namespaceAware

        emit("</"+eName+">");

    }

 

    public void characters(char buf[], int offset, int len)

    throws SAXException

    {

                     String s = new String(buf, offset, len);

        if (textBuffer == null) {

           textBuffer = new StringBuffer(s);

        } else {

           textBuffer.append(s);

        }

    }

 

    //===========================================================

    // Utility Methods ...

    //===========================================================

 

    // Display text accumulated in the character buffer

    private void echoText()

    throws SAXException

    {

        if (textBuffer == null) return;

                           String s = ""+textBuffer;

              emit(s);

              textBuffer = null;

    }

 

    // Wrap I/O exceptions in SAX exceptions, to

    // suit handler signature requirements

    private void emit(String s)

    throws SAXException

    {

        try {

            out.write(s);

            out.flush();

        } catch (IOException e) {

            throw new SAXException("I/O error", e);

        }

    }

 

    // Start a new line

    private void nl()

    throws SAXException

    {

      String lineEnd =  System.getProperty("line.separator");

        try {

            out.write(lineEnd);

        } catch (IOException e) {

            throw new SAXException("I/O error", e);

        }

    }

}

 

从程序中可以看出,解析一个XML文件的核心语句是下面一部分:

     // Use an instance of ourselves as the SAX event handler

        DefaultHandler handler = new Echo01();

 

        // Use the default (non-validating) parser

              SAXParserFactory factory = SAXParserFactory.newInstance();

        try {

            // Set up output stream

            out = new OutputStreamWriter(System.out, "UTF-8");

 

            // Parse the input

            SAXParser saxParser = factory.newSAXParser();

            saxParser.parse( new File(argv[0]), handler);

 

        } catch (Throwable t) {

            t.printStackTrace();

        }

先是创建一个SAXParserFactory工厂类的实例,然后通过SAXParser saxParser = factory.newSAXParser(); 这个工厂类的方法创建了一个saxParser。将xml文件(new File(argv[0]))和一个Sax Event Handlerhandler)(在这个程序里面,这个Handler其实是本身这个类,这个类继承了org.xml.sax.helpers.DefaultHandler 这个类,并且在前面初始化了它:DefaultHandler handler = new Echo01();  )传递给它,让它进行解析。

 

关于xml文件的解析过程中的处理全部在Handler里面实现。一般Parser接受的是DefaultHandler或者HandlerBase这两个类。 这个例子里面的类是继承DefaultHandler这个虚类的。看下图:

 

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

 

DefaultHandler是实现了EntityResolver, DTDHandler, ContentHandler, ErrorHandler四个接口的虚类。分别定义了如下的方法:

 

 

不同的方法,在不同的时候被Parser调用,(这个不同的时候就是Event-based

详细介绍:(暂略)

 

 

DefualtHandlerUML图如下:

 

 

看完Handler,再转过头去看Parser,在代码里面用的是SAXParser(SAXParser saxParser)

仔细看里面的代码

 

你会发现,其实它并没有自己完成解析的工作,而是Wrap了另二个类XMLReaderParser来完成解析工作。原来SAXParser只是起到一个Adapter的工作而已。

 

UML:

 

 

学习笔记-Java中的xml文件读取之SAX解析

SAX解析也是官方的一种XML文件解析方式,它是一种基于事件驱动的解析方式,使用到了回调机制。在解析的时候,并不会一次加载整个XML文件,而是以一种类似于流方式的加载方式。对于解析大型文件来说,十分有...
  • Right_o
  • Right_o
  • 2016年07月06日 23:05
  • 1427

java解析xml 之SAX 解析方式原理

Java 对xml 数据的解析 HTTP 网络传输中的数据组织方式有三种: 1:HTML 方式 2:XML方式 3:JSON 方式 XML :称为可扩展标记语言,他与HTML 一样,都是通用...
  • WannerWang
  • WannerWang
  • 2016年02月19日 17:13
  • 644

kvm虚拟化学习笔记(一)之kvm虚拟化环境安装

平时一直玩RHEL/CentOS/OEL系列的操作,玩虚拟化也是采这一类系统,kvm在RHEL6系列操作系统支持比较好,本文采用采用OEL6.3操作系统,网上所有文章都说KVM比xen简单,我怎么感觉...
  • kepa520
  • kepa520
  • 2015年09月27日 17:14
  • 377

Go语言学习笔记(一) [Go语言的HelloWorld]

日期:2014年7月18日 1、简介     Go 编程语言是一个使得程序员更加有效率的开源项目。Go 是有表达力、简 洁、清晰和有效率的。它的并行机制使其很容易编写多核和网络应用,而新奇...
  • whxaing2011
  • whxaing2011
  • 2014年07月21日 08:45
  • 957

XML解析之一——SAX解析详解

SAX解析 XML文档 Java Web
  • feichexia
  • feichexia
  • 2010年12月10日 17:19
  • 2292

Java解析xml文档之SAX解析

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

Java生成xml——SAX生成

一、SAX生成xml实例 SaxToXmlDemo.java public class SaxToXmlDemo { public static void main(String[] args)...
  • u011024652
  • u011024652
  • 2016年05月29日 16:26
  • 2212

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

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

Java——SAX方式生成XML

使用SAX方式生成XML文件有如下步骤: 创建SAXTransformerFactory对象 通过SAXTransformerFactory对象创建TransformerHandler对象 通过Tra...
  • u012325167
  • u012325167
  • 2016年03月23日 10:05
  • 1438

java中使用SAX读取和写出XML文件

SAX是一种事件驱动的流式XML文件处理方式,区别与DOM方式的是不需要在内存中建一棵DOM树,而是根据读取XML时遇到的标签事件来顺序处理,因此具有速度快,内存占用上的优点。SAX往往是大容量XML...
  • chjttony
  • chjttony
  • 2012年05月28日 20:21
  • 12397
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SAX之Java实现学习笔记(一)
举报原因:
原因补充:

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