`

[原]SAX使用示例

阅读更多

[标题]:[原]SAX使用示例
[时间]:2009-4-25
[摘要]:本文介绍了SAX解析XML的方法。还阐述了创建XMLReader两种方法。一种是使用javax.xml.parsers.SAXParser驱动,另一种是使用第三方驱动org.apache.xerces.parsers.SAXParser。
[关键字]:XML, Java,SAX,SAX Driver,SAX 驱动 , XMLReader,
xerces,SAX2.0,JAXP,
"System property org.xml.sax.driver not specified",
"SAX2 driver class org.apache.xerces.parsers.SAXParser not found"
[环境]:SAX 2.0 ,Xerces-J 2.9.1
[作者]:Winty (wintys@gmail.com) http://www.blogjava.net/wintys

[正文]:
    1、SAX2.0使用org.xml.sax.XMLReader接口代替了Parser接口。如果要使用SAX解析XML,那么首先要获得XMLReader的一个实现对象。
   
    (1)、使用javax.xml.parsers.SAXParser创建XMLReader
        Sun JDK提供了javax.xml.parsers.SAXParser,由SAXParser可以获取一个XMLReader。由于javax.xml.parsers.SAXParser是JDK自带驱动,所以,直接编译就可以运行了。

SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);//开启验证XML功能
SAXParser parser = factory.newSAXParser();
XMLReader reader = parser.getXMLReader();


    (2)、使用第三方驱动。本例使用Xerces驱动:               org.apache.xerces.parsers.SAXParser。
        Xerces驱动下载地址:http://xerces.apache.org/xerces2-j/。
        下载后,找到xercesImpl.jar,并将其加入到classpath路径中。如果不加入classpath路径,可以在编译运行时指定xercesImpl.jar的位置。例:
javac -cp "xercesImpl.jar;." SAXDemo.java
java -cp "xercesImpl.jar;." SAXDemo

        此时,创建XMLReader代码如下:

XMLReader reader = XMLReaderFactory.createXMLReader();

        但是运行时要指定驱动的位置:
java -Dorg.xml.sax.driver=org.apache.xerces.parsers.SAXParser SAXDemo

        也可以在代码中指定具体驱动:

String driver = "org.apache.xerces.parsers.SAXParser";
XMLReader reader = XMLReaderFactory.createXMLReader(driver);

        或者直接创建一个XMLReader:

XMLReader reader = new org.apache.xerces.parsers.SAXParser();

    2、得到XMLReader对象之后就可以解析XML了。SAX是基于事件的,所以,还要设置内容事件处理器ContentHandler和其它事件处理器,DefaultHandler是对ContentHandler等事件处理接口的一个默认实现,如果熟悉AWT/Swing事件处理机制,便不难理解。当然还需要一个InputSource来指定所要解析的XML文件。

reader.setFeature("http://xml.org/sax/features/validation", false);
reader.setContentHandler(mySAXHandler);
reader.setErrorHandler(mySAXHandler);

reader.parse(input);//input是InputSouce类型

   3、SAX解析XML完整的代码实现(注释中包含使用Xerces驱动的方法,可根据需要删除或选用):

/**
 * SAX使用示例
 *
 *Usage:
 *如果未用到Xerces驱动,则直接编译运行。
 *如果用Xerces驱动,则编译运行如下:
 * javac -cp "xercesImpl.jar;." SAXDemo.java
 * java -cp "xercesImpl.jar;." SAXDemo
 *
 * @version 2009-4-25
 * @author Winty(wintys@gmail.com)
 */
import java.io.*;

import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.XMLReader;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.Attributes;
import org.xml.sax.SAXParseException;

import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

public class SAXDemo extends DefaultHandler{
    Writer writer;
    InputSource input;

    public SAXDemo(InputSource input ,  Writer writer){
        this.input = input;
        this.writer = writer;
    }

    public static void main(String[] args)throws Exception{
        InputSource input;
        Writer writer;
        SAXDemo saxDemo;

        input = new InputSource(new FileReader("cdcatalog.xml"));
        writer = new OutputStreamWriter(System.out);
        //writer = new FileWriter("result.txt");
        saxDemo= new SAXDemo(input , writer);

        saxDemo.parse();
    }

    public void parse(){
        XMLReader reader;
        try{
            reader = getXMLReader_Java();

            /*方法2:
            使用Xerces驱动:org.apache.xerces.parsers.SAXParser,
            需指定:java -cp "xercesImpl.jar;." SAXDemo
            */
            //如果使用Xerces驱动,则去除相应方法的注释即可。
            //reader = getXMLReader_Xerces1();
            //reader = getXMLReader_Xerces2();
            //reader = getXMLReader_Xerces3();
           
            MySAXHandler mySAXHandler = new MySAXHandler(writer);
            reader.setFeature("http://xml.org/sax/features/validation", false);
            reader.setContentHandler(mySAXHandler);
            reader.setErrorHandler(mySAXHandler);

            reader.parse(input);
        }catch(SAXException e){
            System.err.println(e.getMessage());
        }catch(IOException e){
            System.err.println(e.getMessage());
        }
    }

    //方法1:使用javax.xml.parsers.SAXParser驱动
    private XMLReader getXMLReader_Java()throws SAXException {
        XMLReader reader = null;
        try{
            SAXParserFactory factory = SAXParserFactory.newInstance();
            factory.setValidating(true);
            SAXParser parser = factory.newSAXParser();
            reader = parser.getXMLReader();
        }catch(ParserConfigurationException e){
            System.err.println(e.getMessage());
        }

        return reader;
    }

    /**
     *方法2-1:
     */
    /*private XMLReader getXMLReader_Xerces1()throws SAXException{
        String driver = "org.apache.xerces.parsers.SAXParser";

        return XMLReaderFactory.createXMLReader(driver);
    }*/

    /* 方法2-2:
     * 还需指定driver类: java -Dorg.xml.sax.driver=org.apache.xerces.parsers.SAXParser
     */
    /*private XMLReader getXMLReader_Xerces2()throws SAXException{
        return XMLReaderFactory.createXMLReader();
    }*/

    /**
     * 方法2-3:
     * 还需指定:javac -cp "xercesImpl.jar;."
     */
    /*private XMLReader getXMLReader_Xerces3()throws SAXException{
        return (new org.apache.xerces.parsers.SAXParser());
    }*/
}

 

class MySAXHandler extends DefaultHandler{
    private Writer writer;

    public MySAXHandler(Writer writer){
        this.writer = writer;
    }

    public void startDocument()throws SAXException{
        try{
            writer.write("开始解析XML\n");
        }catch(IOException e){
            System.err.println(e.getMessage());
        }
    }

    public void endDocument()throws SAXException{
        try{
            writer.write("\n解析XML结束");
            writer.close();
        }catch(IOException e){
            System.err.println(e.getMessage());
        }
    }

    public void startElement(String uri,
                                         String localName,
                                         String qName,
                                         Attributes attributes)
        throws SAXException{

        try{
            writer.write("<" + qName + ">");
        }catch(IOException e){
            System.err.println(e.getMessage());
        }
    }

    public void endElement(String uri,
                                        String localName,
                                        String qName)
        throws SAXException{

        try{
            writer.write("</" + qName + ">");
        }catch(IOException e){
            System.err.println(e.getMessage());
        }
    }

    public void characters(char[] ch,int start,int length)throws SAXException{
        try{
            String str = new String(ch , start , length);
            writer.write(str);
        }catch(IOException e){
            System.err.println(e.getMessage());
        }
    }

    public void error(SAXParseException e)throws SAXException{
        System.err.println(e.getMessage());
    }

    public void warning(SAXParseException e)throws SAXException{
        System.err.println(e.getMessage());
    }

    public void fatalError(SAXParseException e)throws SAXException{
        System.err.println(e.getMessage());
    }
}


附件下载(附件内容:xercesImpl.jar、SAXDemo.java、cdcatalog.xml):SAXDemo.zip

原创作品,转载请注明出处。
作者:Winty (wintys@gmail.com)
博客:http://www.blogjava.net/wintys

 

分享到:
评论

相关推荐

    教你如何用SAX解析XML

    下面我们将通过一个具体的示例来了解SAX的基本原理及其使用方法。 #### 一、SAX简介 SAX是一种用于解析XML文档的标准接口。它以事件驱动的方式工作,当解析器遇到特定元素时会触发回调函数。这种方式特别适合于...

    XMLDemo解析的原代码。部署上服务器就能使用。

    在XMLDemo1中,可能使用了`org.xml.sax.helpers.DefaultHandler`和`org.xml.sax.XMLReader`等类实现SAX解析。 在部署到服务器的过程中,XMLDemo可能扮演配置文件的角色,例如Spring框架中的bean定义,或者作为Web...

    xml解析(原创)

    XML解析分为两种主要方式:DOM(Document Object Model)和SAX(Simple API for XML)。DOM解析器会将整个XML文档加载到内存中,形成一个树形结构,允许开发者遍历和修改整个文档。这种方式适合小型文档,但对大型...

    在-Android-上使用-XML.docx

    下面是一个使用SAX解析RSS提要的示例代码: ```java import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class RSSHandler extends ...

    NativeXml329.zip

    它的最新版本不仅提供了最新的特性和优化,还包含了丰富的示例,帮助开发者更好地理解和使用这个库。在本文中,我们将深入探讨NativeXml329的核心特性、使用方法以及它在实际开发中的应用。 1. **核心特性** ...

    xml解析文件

    这些案例通常会包含代码示例,演示如何处理开始元素、结束元素、字符数据等事件。 总结: XML解析器的选择取决于具体需求,如内存限制、处理速度、复杂查询等。DOM适用于需要频繁查询和修改文档的场景,SAX适用于大...

    Python and XML

    - 在使用SAX解析器时,开发者需要实现特定的回调函数,当解析器遇到元素开始、元素结束等事件时调用这些函数。 - 这种设计使得SAX非常适合流式处理,可以有效地处理大量数据。 - **3.3 阅读文章示例** - 使用SAX...

    java原版实例手册

    通过《Java原版实例手册》中的"Codesamples.PDF",读者可以找到对应的代码示例,实际动手操作以加深理解。"说明.txt"可能包含了对书中内容的进一步解释或者使用指南,而".url"文件则可能是链接到更多学习资源的网页...

    JAVA解析XML

    本篇文章将详细介绍Java中四种主要的XML解析方法:SAX(Simple API for XML)、DOM(Document Object Model)、DOM4J和JDOM,并通过示例代码展示它们的用法。 1. **SAX解析器**: SAX是一种基于事件驱动的解析方式...

    Java核心技术 10th(原书)

    4. **XML处理**:涵盖了解析、生成XML文档,以及使用DOM、SAX和JAXB等API。 5. **反射与动态代理**:介绍了Java反射机制,用于在运行时检查和修改程序的行为。 6. **垃圾收集与内存管理**:探讨Java的自动内存管理...

    androidWebApp

    这个名为"androidWebApp"的项目是一个Google提供的示例,它展示了如何在Android环境中有效地实现一个基于Web的应用程序。下面我们将深入探讨其中涉及的关键知识点。 首先,Android Web App的核心是WebView组件,它...

    jdom-1.1.1 和API

    这比使用基于DOM(Document Object Model)或SAX(Simple API for XML)的传统XML处理方式更为直观和便捷。 JDOM-1.1.1的JAR文件是库的主要组成部分,包含所有必要的类和方法,用于读取、写入、构建和操作XML文档。...

    解析并保存xml

    总结一下,本示例涉及的关键知识点包括: - Socket编程:服务器与客户端的连接、数据传输。 - 文件操作:保存从Socket接收的数据到本地文件。 - XML解析:了解DOM、SAX和StAX解析器的工作原理及应用场景。 在实际...

    XML.rar_COM_DEMO_xml_xml 类_xml文件

    在实际应用中,处理XML文件可能涉及到错误处理、DOM(Document Object Model)和SAX(Simple API for XML)解析策略的选择,以及XPath或XSLT(XSL Transformations)等高级功能的使用,用于查询和转换XML数据。...

    Android Http简单应用源码.rar

    这个"Android Http简单应用源码"提供了一个基础示例,展示了如何在Android应用中使用HTTP协议进行数据交换。这里我们将深入探讨其中涉及的关键知识点。 首先,Android系统对于网络访问有一套严格的权限管理机制。在...

    使用WebService的方法返回xml格式的数据

    9. **示例代码**: - 使用Java的JAX-WS创建WebService,可以定义一个方法如: ```java @WebService public class DatabaseService { @WebMethod public String getDataFromDB() { // 连接数据库,执行查询,...

    XML学习课件与原代码

    在本“XML学习课件与原代码”中,我们可以深入学习XML的基本概念、语法以及如何在实际项目中应用XML。 一、XML基本概念 1. XML的全称:XML代表可扩展标记语言,它的主要目的是使数据更具结构化,便于机器理解和处理...

    安卓网站交互JSONxmlWebserviceUPnP相关-把wap网站生成android的app.rar

    在Android中,解析XML通常用到的库有DOM、SAX和Pull Parser。 3. WebService:是服务提供者通过网络(通常是HTTP协议)向其他应用程序提供数据的一种方式。在Android中,可以使用SOAP(Simple Object Access ...

Global site tag (gtag.js) - Google Analytics