创建SAX解析器

转载 2006年06月07日 15:24:00

示例文件

如何构造这样一个应用程序,它使用 SAX 来记录一组用户的答案,这些用户被要求就他们与外星人的遭遇接受调查。

下面是调查表:

调查屏幕快照

答案将存储在一个 XML 文件中:

<?xml version="1.0"?>
<surveys>
<response username="bob">
   <question subject="appearance">A</question>
   <question subject="communication">B</question>
   <question subject="ship">A</question>
   <question subject="inside">D</question>
   <question subject="implant">B</question>
</response>
<response username="sue">
   <question subject="appearance">C</question>
   <question subject="communication">A</question>
   <question subject="ship">A</question>
   <question subject="inside">D</question>
   <question subject="implant">A</question>
</response>
<response username="carol">
   <question subject="appearance">A</question>
   <question subject="communication">C</question>
   <question subject="ship">A</question>
   <question subject="inside">D</question>
   <question subject="implant">C</question>
</response>
</surveys>

创建事件处理程序
 

在应用程序能够使用 SAX 来处理 XML 文档之前,它必须首先创建一个事件处理程序。
SAX 提供了一个类DefaultHandler,应用程序可以扩展该类。

要使用 SAX 来进行正确的解析,需要对处理程序的方法进行特殊调用,而这些调用
不能是静态的。这意味着您需要特别地实例化处理程序对象,因此下面将提供简单的
概述,以防您还不习惯使用对象。

当新的对象被创建时,它会寻找要执行的任何类构造函数。例如:

import org.xml.sax.helpers.DefaultHandler;

public class SurveyReader extends DefaultHandler
{

   public SurveyReader() {
      System.out.println("Object Created.");
   }

   public void showEvent(String name) {
      System.out.println("Hello, "+name+"!");
   }

   public static void main (String args[]) {
   
      SurveyReader reader = new SurveyReader();
      reader.showEvent("Nick");
   }

}

main 方法执行时,它会创建 SurveyReader 类的一个新实例。这样会导致构
造函数执行,从而输出 Object Created(以及下面的问候语)。然后您可以使用
该对象来执行 showEvent() 方法。

 

直接指定 SAX 驱动程序

在准备好事件处理程序之后,下一步就是使用 SAX 驱动程序来创建解析器,或 XMLReader
您可以使用三种方式中的任一种来创建解析器:

  • 直接调用驱动程序
  • 允许在运行时指定驱动程序
  • 将驱动程序作为 createXMLReader() 的参数来传递

如果知道 SAX 驱动程序的类名称,您可以直接调用它。例如,如果该类是(虚构的)
com.nc.xml.SAXDriver,您可以使用如下代码:

try {
   XMLReader xmlReader = new com.nc.xml.SAXDriver();
} catch (Exception e) {
   System.out.println("Can't create the parser: " + e.getMessage());
}

来直接创建 XMLReader

您还可以使用系统属性来使得应用程序更灵活。例如,您可以在运行应用程序时,从命令行
将类名称作为 org.xml.sax.driver 属性的值来指定。

java -Dorg.xml.sax.driver=com.nc.xml.SAXDriver SurveyReader

(注意,-D 后面 应该有空格。)

这使得该信息对 XMLReaderFactory 可用,因此您可以使用这样的代码:

try {
   XMLReader xmlReader = XMLReaderFactory.createXMLReader();
} catch (Exception e) {
   System.out.println("Can't create the parser: " + e.getMessage());
}

如果您知道驱动程序名称,还可以将它作为 createXMLReader() 的参数来直接传递。

 

创建解析器

这个例子使用了一对类 SAXParserFactorySAXParser 来创建解析器,因此您不
必知道驱动程序本身的名称。

首先声明 XMLReaderxmlReader,然后使用 SAXParserFactory 来创建一个
SAXParser
XMLReader 是由 SAXParser 提供的。

import org.xml.sax.helpers.DefaultHandler;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.XMLReader;

public class SurveyReader extends DefaultHandler
{

   public SurveyReader() {
   }

   public static void main (String args[]) {
      
   XMLReader xmlReader = null;
      
      try {

         SAXParserFactory spfactory = SAXParserFactory.newInstance();
         
         SAXParser saxParser = spfactory.newSAXParser();

         xmlReader = saxParser.getXMLReader();
		 
      } catch (Exception e) {
            System.err.println(e);
            System.exit(1);
      }
      

   }
}
验证与非验证解析器
 

要使用 XML 文档做任何事情,你都必须读取其中的信息。做这个工作的应用程序称为解析器

解析器的两种类型分别是:非验证验证

  • 非验证解析器是适用于格式良好(well-formed)文档的解析器。 它读取每个信息
    单元,并将其添加到文档 —— 或者在 SAX 应用程序的情况下处理事件,而不管实际
    的结构和内容如何。
  • 另一方面,验证解析器根据已定义的语法检查 XML 文档的内容和结构。 有时,这个
    语法是文档类型定义(Document Type Definition,DTD)的形式,但是近来它更
    可能在 XML Schema 文档中定义。在任一种情况下,解析器都会检查文档,以确保每
    个元素和属性都已定义,并且包含正确类型的内容。例如,您可以指定每个 order
    (订单)
    都有一个status(状态)。 如果在没有语法定义的情况下尝试创建文档,
    验证解析器将会提示错误。

已经由验证解析器检验过的文档被认为是有效的文档。

 

设置验证选项

对于本教程,您将不会验证调查结果,因此可以通过设置 validating 属性,关闭
SAXParserFactory 创建的任何解析器的验证特性:

...
public static void main (String args[]) {
      
   XMLReader xmlReader = null;
      
   try {

      SAXParserFactory spfactory = 
           SAXParserFactory.newInstance();

      spfactory.setValidating(false);
						
      SAXParser saxParser = 
                 spfactory.newSAXParser();

      xmlReader = saxParser.getXMLReader();
		 
   } catch (Exception e) {
         System.err.println(e);
         System.exit(1);
   }
}
...
设置内容处理程序
 

解析器必须将它的事件发送到一个 ContentHandler。为简单起见,SurveyReader
将同时用作主应用程序和内容处理程序,因此创建它的一个新实例,并使用 XMLReader
setContentHandler() 方法来将它设置为 ContentHandler

...
    xmlReader = saxParser.getXMLReader();

    xmlReader.setContentHandler(new SurveyReader());
		 
 } catch (Exception e) {
...

当然,这是内容处理程序的唯一选项。

 

解析 InputSource

要实际解析一个文件(或解析其他任何内容!)您需要一个 InputSource。这个 SAX
类包装了你要处理的任何数据,因此您不必(太)关心它来自何处。

现在您就准备好实际解析文件了。parse() 方法接受该文件,将它包装到
InputSource 中,然后处理它,同时将每个事件发送给 ContentHander

...

import org.xml.sax.InputSource;

...
    xmlReader = saxParser.getXMLReader();
    xmlReader.setContentHandler(new SurveyReader());
		 
    InputSource source = new InputSource("surveys.xml");
    xmlReader.parse(source);
		 
 } catch (Exception e) {
...

 

设置 ErrorHandler

您可以像创建内容处理程序一样创建一个错误处理程序。通常,您会把这个处理程序创建
ErrorHandler 的一个单独的实例,但是为简化这里的例子,我们将把错误处理直
接包括在 SurveyResults 中。这种双重用途是可以实现的,因为该类扩展了
DefaultHandler,因而同时包括了 ContentHandler 方法和 ErrorHandler
方法的实现。

设置新的 ErrorHandler 就像设置 ContentHandler 一样:

...
xmlReader.setContentHandler(new SurveyReader());

xmlReader.setErrorHandler(new SurveyReader());
		 
InputSource source = new InputSource("surveys.xml");
...

同样,如果此时运行应用程序,仍然应该什么事情也不会发生,因为每个事件的默认实现
不做任何事情。在下一节中,我们将考察添加新的实现来处理解析期间发生的事件。

XML-解析技术(dom解析,sax解析)

XML解析方式分为两种:dom和sax    dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。    sax: (Simpl...
  • WillCold
  • WillCold
  • 2013年10月25日 08:50
  • 1117

XML两种解析思想:DOM和SAX

一、什么是XML英文全称为Extensible Markup Language,翻译过来为可扩展标记语言。现实生活中存在着大量的数据,在这些数据之间往往存在一定的关系,我们希望能在计算机中保存和处理这...
  • wujingjing_crystal
  • wujingjing_crystal
  • 2016年09月27日 18:31
  • 748

QT开发(四十三)——SAX方式解析XML

QT开发(四十三)——SAX方式解析XML一、SAX简介SAX是Simple API for XML的简写,是一种解析XML文件的替代方法,不是由W3C官方所提出的标准,是一种事件驱动的XML API...
  • A642960662
  • A642960662
  • 2017年03月26日 12:47
  • 269

Java——SAX方式生成XML

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

SAX解析与DOM解析的区别

1.SAX解析(Simple API for XML) SAX解析方式:逐行扫描文档,一遍扫描一遍解析。相比于DOM,SAX可以在解析文档的任意时刻停止解析解析,是一种速度更快,更高效的方法。 优点:...
  • sinat_27170093
  • sinat_27170093
  • 2017年01月07日 13:50
  • 916

java环境下读取xml文件的方法主要有4种:DOM、SAX、JDOM、JAXB

在java环境下读取xml文件的方法主要有4种:DOM、SAX、JDOM、JAXB 1.  DOM(Document Object Model)   此 方法主要由W3C提供,它将xml文件全...
  • songjinbin
  • songjinbin
  • 2013年11月26日 14:41
  • 3008

SAX解析,生成xml文件

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

Java生成xml——SAX生成

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

Java生成和解析XML格式文件和字符串的实例代码【dom4j中的SAXReader对象读取并解析xml文件】

文章来源:http://www.jb51.net/article/46893.htm 1、基础知识: Java解析XML一般有四种方法:DOM、SAX、JDOM、DOM4J。 2、使用介绍 1)、DO...
  • buster2014
  • buster2014
  • 2014年12月15日 11:31
  • 2075

JavaEE实战——XML文档DOM、SAX、STAX解析方式详解

本文主要介绍XML文档作为存储和传输数据的三种解析方式,其各自主要的思想、实现方式、CURD实现,以及最后展示一个综合的实战例子加以巩固理解。...
  • zhongkelee
  • zhongkelee
  • 2016年06月22日 23:10
  • 2248
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:创建SAX解析器
举报原因:
原因补充:

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