`
躁动的绵羊
  • 浏览: 96180 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

XML教程——采用SAX来解析XML

阅读更多

什么是 SAX

读取和操纵 XML 文件的标准方法是 DOM(“文档对象模型”)。遗憾的是,这种方法需要读取整个文件并将它存储到树结构中,因而效率不高、缓慢,并且会过度使用资源。

一种替代方法是使用 Simple API for XML 或 SAX。SAX 允许正在读取文档时处理该文档,这避免了在采取操作之前需要等待存储文档的所有内容。

SAX 是由 XML-DEV 邮件列表的成员开发的,Java 版本由 David Megginson 维护。他们的目的是提供一种更自然的方法来使用 XML,这种方法不会涉及到使用 DOM 的那种开销。

结果是基于事件的 API。解析器将事件(譬如,元素的开始或结束)发送给处理信息的事件处理程序。然后,应用程序自己可以处理数据。虽然原始文档保持不变,但 SAX 提供了操纵数据的方法,然后会将该方法导向另一个过程或文档。

对于 SAX,没有官方的标准;万维网(W3C)或其它官方组织不维护 SAX,但在 XML 社区中,它是一个事实上的标准。


SAX 处理是如何工作的

SAX 分析经过其的 XML 流,这非常象老式的自动收报机纸条。考虑以下 XML 代码片断:

<?xml version="1.0"?>
<samples>
<server>UNIX</server>
<monitor>color</monitor>
</samples>

 

一般情况下,SAX 处理器分析这段代码将生成以下事件:

Start document
Start element (samples)
Characters (white space)
Start element (server)
Characters (UNIX)
End element (server)
Characters (white space)
Start element (monitor)
Characters (color)
End element (monitor)
Characters (white space)
End element (samples)

 

SAX API 允许开发者捕获这些事件,并对它们进行操作。

SAX 处理涉及以下几步:

  1. 创建事件处理程序。
  2. 创建 SAX 解析器。
  3. 将事件处理程序分配给解析器。
  4. 对文档进行解析,将每个事件发送给处理程序。

在SAX与DOM之间,如何选择

选择 DOM 还是 SAX,这取决于几个因素:

  1. 应用程序的目的:如果必须对数据进行更改,并且作为 XML 将它输出,则在大多数情况下,使用 DOM。与使用 XSL 转换来完成的简单结构更改不一样,如果是对数据本身进行更改,则尤其应该使用 DOM。
  2. 数据的数量:对于大文件,SAX 是更好的选择。
  3. 将如何使用数据:如果实际上只使用一小部分数据,则使用 SAX 将数据抽取到应用程序中,这种方法更好些。另一方面,如果知道将需要向后引用已经处理过的信息,则 SAX 可能不是正确的选择。
  4. 需要速度:通常,SAX 实现比 DOM 实现快。

记住 SAX 和 DOM 不是互斥的,这一点很重要。可以使用 DOM 来创建事件的 SAX 流,可以使用 SAX 来创建 DOM 树。事实上,大多数解析器实际常常使用 SAX 来创建 DOM 树!


使用 JAXP 来创建解析器

接下来我们来看一下JAXP的SAX Parser是怎么样工作的。

首先声明 XMLReader xmlReader。然后使用 SAXParserFactory 来创建 SAXParser。正是 SAXParser 给您了 XMLReader。

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();
spfactory.setValidating(false);	//设置验证选项,
如果您的XML文件是有效文档的话,
就不用验证.这将提高处理速度
SAXParser saxParser = spfactory.newSAXParser();
xmlReader = saxParser.getXMLReader();
} catch (Exception e) {
System.err.println(e);
System.exit(1);
}
}
}

 


设置内容处理程序

一旦创建了解析器,则需要将 SurveyReader 设置为内容处理程序,以便于其接收事件。

xmlReader 的 setContentHandler() 方法完成这项工作。

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

 

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


解析 InputSource

为了对文件进行实际地解析,需要 InputSource。这个 SAX 类封装了所有将要处理的数据,所以不必担心它来自哪里。

现在,准备对文件进行实际解析。应用程序将封装在 InputSource 中的文件传递给 parse(),然后应用程序会继续运行。

...
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,所以这种双重用法是可能的。

需要关注的事件有三个:警告、错误和致命错误。

...
import org.xml.sax.SAXParseException;
public class SurveyReader extends DefaultHandler
{
public SurveyReader() {
}
public void error (SAXParseException e) {
System.out.println("Error parsing the file: "+e.getMessage());
}
public void warning (SAXParseException e) {
System.out.println("Problem parsing the file: "+e.getMessage());
}
public void fatalError (SAXParseException e) {
System.out.println("Error parsing the file: "+e.getMessage());
System.out.println("Cannot continue.");
System.exit(1);
}
}
....
xmlReader.setContentHandler(new SurveyReader());
xmlReader.setErrorHandler(new SurveyReader());
//设置 ErrorHandler
InputSource source = new InputSource("surveys.xml");
....
public static void main (String args[]) {
...

 


SAX 事件

以下事件是常用的;它们都在 org.xml.sax 包的 HandlerBase 类中定义。

  1. startDocument 表示文档开始。
  2. endDocument 表示文档结束。
  3. startElement 表示元素开始。当一对标记中的起始标记中的所有内容被处理后,解析器 激发此事件。包括了标记名和其属性。
  4. endElement 表示元素结束。
  5. characters 包含字符数据,类似于 DOM 的一个 Text 节点。

还有更多的 SAX 事件:

  1. ignorableWhitespace 此事件类似于我们前面所讨论的无用 DOM 节点。它与 character 事件的区别,好处是:如果您不需要空格符,您可以通过忽略这个事件来忽略所有的空格符。
  2. warning、error 和 fatalError 这三个事件表示了解析错误。您可根据需要来响应它们。
  3. setDocumentLocator 这个事件允许您存储一个 SAX 的 Locator 对象。Locator 对象可以用来找出在文档中确切发生事件的地方。
<!-- CMA ID: 162355 --><!-- Site ID: 10 --><!-- XSLT stylesheet used to transform this file: dw-article-6.0-beta.xsl -->

 

分享到:
评论

相关推荐

    Android XML解析——Sax解析XML

    ### Android中使用SAX解析XML 1. **引入库**:在Android项目中,SAX解析器已经内置在`org.xml.sax`包中,无需额外导入库。 2. **创建ContentHandler**:创建一个实现了`org.xml.sax.ContentHandler`接口的类,重写...

    Android创建与解析XML(三)——详解Sax方式

    本文将深入讲解如何在Android中使用SAX解析XML以及如何通过SAX方式创建XML。 **1. SAX解析XML** SAX解析XML的基本流程是:创建SAXParserFactory,通过该工厂实例化SAXParser,然后设置事件处理器(ContentHandler...

    XML——sax解析 极速入门易懂示例

    在Java中,使用SAX解析XML有以下几种方式: 1. **XMLReader**:这是SAX解析的核心组件,它提供了一组方法来配置解析器的行为。首先,我们需要通过`XMLReaderFactory`获取一个`XMLReader`实例,然后设置事件处理器...

    android开发之xml文件操作——SAX

    在Android项目中,我们通常需要以下步骤来使用SAX解析XML: 1. 创建一个继承自`DefaultHandler`的类,比如我们可以命名为`MySAXHandler`。在这个类中,我们需要重写`startElement`、`endElement`和`characters`方法...

    xml实用技术教程—— 顾兵

    本教程“XML实用技术教程——顾兵”深入浅出地介绍了XML的基本概念、语法规范以及在实际应用中的技巧。 一、XML基础 1. XML结构:XML文档由元素、属性、文本、注释和处理指令等组成。元素是XML的核心,用于定义...

    xml——————表单资源

    SAX解析器采用事件驱动的方式,逐行处理XML,占用内存少,适用于大文件;StAX则提供了一个流式接口,允许程序按需读取或写入XML。 此外,XPath是XML的一个查询语言,用于选取XML文档中的节点,而XSLT(Extensible ...

    XML解析器————

    例如,对于DOM解析,可以创建`DOMParser`实例,然后使用`parse()`方法解析XML文档;对于SAX解析,可以实现`ContentHandler`接口,并注册到`SAXParser`中。同时,可以通过`XMLSchemaValidator`进行XML Schema验证。 ...

    Android中,使用SAX和PULL解析天气预报XML

    本文将深入探讨如何在Android中使用两种常见的XML解析技术——SAX(Simple API for XML)和PULL(Pull Parser)来解析天气预报的XML数据。这两种方法各有优缺点,适用于不同的场景。 首先,我们来看SAX解析器。SAX...

    Android XML解析—— Pull解析XML(待完善)

    - **适合解析简单结构的XML**:对于结构复杂、嵌套深度大的XML,Pull解析可能不如DOM或SAX解析直观。 在实际开发中,如Android的布局文件解析、配置文件读取或者从网络获取XML数据时,都可以使用Pull解析器进行处理...

    XML学习教程——PHP资源

    8. **SAX解析XML**:SAX解析器通过触发一系列事件(如开始元素、结束元素等)来处理XML文档,适合处理大型XML文件。 9. **DOM解析XML**:DOM解析器将XML文档转换为一棵树形结构,每个元素、属性和文本都是树的一个...

    android开发之xml文件操作——xml创建和pull解析xml

    SAX解析器采用事件驱动模型,逐行读取,适合处理大型XML文件,但编程相对复杂。而Pull解析器是SAX解析器的一种简化版本,它提供了一种更简单的API,开发者可以按照需要向前移动解析器,按需读取XML数据,降低了内存...

    Java Web 开发实战经典(基础篇)

    010303_XML解析 —— SAX 010304_XML解析 —— JDOM 010305_XML解析 —— DOM4J 010306_使用JavaScript操作DOM 010401_Tomcat服务器的安装及配置 020501_注释及Scriptlet 020502_page指令 020503_包含指令 020504_...

    安卓Android源码——比较通用的xml解析方法.rar

    本资料包“安卓Android源码——比较通用的xml解析方法”将深入探讨在Android平台上解析XML的多种方法。 1. DOM解析器(Document Object Model) DOM解析器将整个XML文档加载到内存中,创建一个树形结构,便于遍历和...

    VTD-XML 不同于SAX和DOM的XML高效解析器

    SAX解析器占用的内存较少,适合处理大型XML文件,但不支持XPath,且不保留完整的文档结构,因此不适合需要多次查找或修改文档的场景。 **DOM解析器** DOM解析器将整个XML文档加载到内存中,形成一个树形结构,每个...

    sax,dom解析xml和生产xml文件

    本文将深入探讨两种主要的XML解析方法——SAX(Simple API for XML)和DOM(Document Object Model),并讲解如何使用它们来解析XML文件以及生成XML文件。 一、SAX解析XML SAX是一种事件驱动的解析器,它逐行扫描...

    Android源码——ReadXmlByPull 使用Pull解析Xml文件.zip

    本主题将深入探讨如何使用Android中的Pull解析器(Pull Parser)来读取和解析XML文件。Pull解析器是一种事件驱动的解析方式,它不需要完整的XML文档加载到内存中,而是按需读取,降低了内存消耗。 首先,让我们理解...

    SAX与JAVA.rar_SAX java_java SAX_java sax download_sax_xml

    1. **NewFibonacciClient.java**:可能是一个使用SAX解析XML来生成斐波那契数列的示例。 2. **LocatorDemo.java**:展示了如何使用SAX的Locator接口来跟踪XML解析过程中的位置信息。 3. **SAXSpider.java**:可能是...

    解析xml的jar包

    解析XML是将XML文档转换为程序可以理解的数据结构的关键步骤。本文将深入探讨XML解析的基本概念、常用方法以及相关的Java库——JDOM。 XML文档由一系列元素构成,每个元素都包含标签、属性和内容。解析XML的过程...

    安卓Android源码——比较通用的xml解析方法.zip

    本资源“安卓Android源码——比较通用的xml解析方法.zip”显然聚焦于探讨在Android平台上解析XML的不同方法。这里我们将深入探讨两种主要的XML解析技术:SAX(Simple API for XML)和DOM(Document Object Model),...

Global site tag (gtag.js) - Google Analytics