`
nakupanda
  • 浏览: 419825 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java中使用SAX读写XML文件

    博客分类:
  • java
阅读更多
时间: 2007-10-13

SAX 是 Simple API for XML 的简写。虽说simple,用起来却比DOM麻烦,不过麻烦是有性能作为回报的。

SAX不会一次组织一整棵XML文档的抽象树给你使用,而是看到什么就问一下你要不要执行什么,这就是所谓的“基于事件”。

XML文件继续使用DOM和JDOM中的例子,当SAX解析器(实际上好像不应这么叫)读取文件,遇到“<books>”元素的时候,它知道这是文档开头,于是问你要不要干些什么;然后继续读取XML文档,当遇到“<book>”元素时,它又会问你要不要干些什么...直到整个XML文件被读取完毕,不过这时它还会问你,“文档读完了,你要不要干些什么呢?”...

关于这个过程,较为专业的说法是:


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 处理涉及以下几步:

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


以下是一个例子,扩展DefaultHandler类,因为此类已实现ContentHandler所有方法,所以我们使用时只需要覆盖要用到的几个方法就行了。



SAX是边读取边解析文档的,当它读到XML文件中间部分的时候,它不知道之前曾经读过些什么,也不知道以后会读到些什么,所以我们要想办法将已读的信息保存起来。因为一个books里有多个book,一个book里有title、author等属性,所以我们可以创建一个book元素的抽象对象,放到一个代表books的Hashtable里面。

这个book对象的代码:


public class BookBean {
 private String title = "";
 private String author = "";
 private String url = "";
 private String day ="";
 private String month ="";
 private String year ="";
 public String getAuthor() {
  return author;
 }
 public void setAuthor(String author) {
  this.author = author;
 }
 public String getDay() {
  return day;
 }
 public void setDay(String day) {
  this.day = day;
 }
 public String getMonth() {
  return month;
 }
 public void setMonth(String month) {
  this.month = month;
 }
 public String getTitle() {
  return title;
 }
 public void setTitle(String title) {
  this.title = title;
 }
 public String getUrl() {
  return url;
 }
 public void setUrl(String url) {
  this.url = url;
 }
 public String getYear() {
  return year;
 }
 public void setYear(String year) {
  this.year = year;
 }
 public String getDate()
 {
  return this.day+"-"+this.month+"-"+this.year;
 }
}





以下是一个使用SAX读取XML文件的例子:




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

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.util.*;

public class MySAX extends DefaultHandler
{
 private Hashtable table = null;
 private BookBean book = null;
 private String value = "";

 
 public MySAX()
 {
  System.out.println("invoke MySAX().");
  table = new Hashtable();
 }
 
 public void open(String xmlfile)
 {
  try{
   SAXParserFactory spf = SAXParserFactory.newInstance();
   spf.setValidating(false);
   SAXParser parser = spf.newSAXParser();
   XMLReader myreader = parser.getXMLReader();
   myreader.setContentHandler(this);
   InputSource source = new InputSource(xmlfile);
   myreader.parse(source);
   
   

  }catch(Exception e){
   System.out.println("an error caused.");
  }  
 }
 
 public static void main(String args[])
 {
  System.out.println("main.");
  MySAX ms = new MySAX();
  ms.open("e:/xml.xml");
  Hashtable table = ms.getTable();
  Enumeration enu = table.keys();
  while(enu.hasMoreElements()){
   String title = (String)enu.nextElement();
   BookBean book = (BookBean)table.get(title);
   System.out.println(book.getTitle());
  }
 }
 
 public void startDocument() throws SAXException
 {
  System.out.println("startDocument");
 }
 public void startElement(String namespaceURI,String localName,String qName,Attributes attrs) throws SAXException
 {
   if(qName.equals("book"))
   {
    if(book!=null)
     table.put(book.getTitle(),book);
    book = new BookBean();
   }
 }
 
 public void endElement(String namespaceURI,String localName,String qName) throws SAXException
 {
  if(qName.equals("title"))
   book.setTitle(value);
  if(qName.equals("author"))
   book.setAuthor(value);
  if(qName.equals("url"))
   book.setUrl(value);
  if(qName.equals("day"))
   book.setDay(value);
  if(qName.equals("month"))
   book.setMonth(value);
  if(qName.equals("year"))
   book.setYear(value);
 }
 
 public void characters(char ch[],int start,int length) throws SAXException
 {
  value = new String(ch,start,length);
 }
 
 public void endDocument() throws SAXException
 {
  table.put(book.getTitle(),book);
 }
 
 public Hashtable getTable()
 {
  return this.table;
 }
}
分享到:
评论

相关推荐

    SAX与JAVA.rar_SAX java_java SAX_java sax download_sax_xml

    9. **NamespaceSupport.java**:SAX解析器通常需要处理命名空间,这个类可能实现了对XML命名空间的支持。 10. **ExtractorDriver.java**:这可能是一个主驱动类,用于启动和控制上述所有提取或解析任务。 这些程序...

    使用DOM解析XML和使用SAX解析XML

    总结而言,选择使用DOM或SAX解析XML文档需要考虑文档的大小、是否需要修改文档、内存资源的限制以及是否需要频繁地访问文档中的数据。对于需要频繁操作且文档不是特别大的场景,DOM可能更为合适;而对于只需要一次性...

    java_xml.rar_java xml_sax_xml_xml ja_操作 xml

    这种解析方式便于遍历整个文档并进行修改,但对内存和CPU资源的需求较高,适合处理小型XML文件。 - **DOM解析器优点**:提供随机访问,可以轻松地修改文档的任何部分。 - **DOM解析器缺点**:对于大文件,可能会...

    Java使用sax、dom、dom4j解析xml文档

    XML(eXtensible Markup Language)是一种用于存储和传输数据的标准格式,特别是在Java应用程序中,XML经常被用来作为数据交换的载体。Java提供了多种解析XML的API,包括SAX(Simple API for XML)、DOM(Document ...

    Sax解析XML文件解析

    1. **顺序性**:由于SAX是按顺序解析,因此无法随机访问XML文档中的任何部分。 2. **复杂性**:处理复杂的XML结构可能需要编写大量的事件处理代码,且代码组织相对困难。 3. **错误处理**:SAX解析器会在遇到错误时...

    XML-java.rar_XML SAX_sax_sax xml_sax 解析 xml_xml using dom

    - JDOM库的导入和使用方法,包括创建XML文档、解析XML文件、修改XML数据等。 - JOM4J库的API介绍和使用示例,展示如何快速读写XML,以及执行XPath查询。 - 演示如何配置和实现SAX事件处理器,处理XML解析过程中的...

    DOM、SAX、JDOM、DOM4J读写xml文档

    在Java中,有几种不同的API可以用来处理XML文档,包括DOM、SAX、JDOM和DOM4J。下面将详细介绍这四种方式。 **DOM(Document Object Model)** DOM是一种树形结构的API,它将整个XML文档加载到内存中,形成一个可...

    JAVA100例之实例69 JAVA使用SAX解析XML

    总的来说,“JAVA100例之实例69 JAVA使用SAX解析XML”旨在帮助开发者理解并掌握SAX解析器的使用,通过编写回调函数实现对XML文档的解析和处理,提升在实际项目中的XML处理能力。通过学习这个实例,你可以更深入地...

    使用SAX读取XML文件

    本文将深入探讨如何使用SAX(Simple API for XML)解析器来读取XML文件,这是一种基于事件驱动的解析方式,非常适合处理大型或内存受限的环境。 SAX解析器不同于DOM(Document Object Model)解析器,DOM会将整个...

    Android中使用SAX对XMl文件进行解析

    本教程将详细介绍如何在Android项目中使用SAX解析XML文件。首先,我们需要添加SAX解析器的依赖。在Android Studio的build.gradle文件中,确保已经包含了对`org.xml.sax`的支持,这通常作为Android SDK的一部分默认...

    dom和sax对xml的解析

    在Java中,有多种方式可以解析XML文档,其中最常用的是DOM(Document Object Model)和SAX(Simple API for XML)。本篇文章将详细介绍DOM和SAX解析XML的方法,并通过提供的`DomDemo.java`和`SaxDemo.java`示例代码...

    [Android]使用SAX解析XML文件

    本篇将重点讲解如何使用SAX(Simple API for XML)解析XML文件,这是一种事件驱动的解析方式,非常适合处理大体积的XML文件,因为它不会一次性加载整个文件到内存中,从而节省了资源。 首先,了解SAX解析的基本原理...

    sax解析xml

    SAX(Simple API for XML)是XML解析的一种方法,它采用事件驱动的方式处理XML文档,对内存占用较少,适合处理大型XML文件。 在Java中,SAX解析器遵循XML规范,当解析XML文档时,会触发一系列的事件,如开始文档、...

    SAX对xml文档进行解析

    XML(eXtensible Markup Language)是一种用于存储和传输数据的标记语言,广泛应用于Web服务、配置文件、数据交换等...但在需要对XML文档进行结构化操作或需要随机访问的情况下,可能需要考虑使用DOM或其他解析方式。

    Java解析XML文件的DOM和SAX方式.doc

    Java 解析 XML 文件的 DOM 和 SAX 方式是指在 Java 中使用 Document Object Model(DOM)和 Simple API for XML(SAX)两种方式来解析 XML 文件的技术。下面将详细介绍这两种方式的原理、实现和优缺点。 DOM 方式 ...

    XML.rar_XML SAX_XML java_dom xml_java xml_java解析xml

    - 处理事件:在事件处理器的`startElement()`、`endElement()`、`characters()`等方法中编写代码,对XML数据进行处理。 3. DOM与SAX比较: - DOM适合处理小型XML文档,且需要频繁查询和修改数据的情况,因为它能...

    使用SAX解析xml文件

    在Java中,SAX解析XML文件的主要优点包括: 1. **内存效率**:SAX不将整个XML文档加载到内存中,而是逐行读取,因此对于大文件,它的内存消耗远低于DOM解析器。 2. **实时处理**:SAX解析器在解析过程中触发事件,如...

    java中读写XML文件

    在Java编程语言中,XML(eXtensible Markup Language)是一种重要的数据交换格式,用于存储和...在提供的"在java中读写XML文件.ppt"和"源码"中,可能包含了更多详细的步骤和示例代码,可以帮助你进一步理解这个主题。

    Java读写xml java 读写xml文件操作, 简单易懂

    Java提供了多种读写XML文件的方法,包括SAX、DOM、StAX以及JAXB等。本文将基于提供的文件信息,深入探讨如何利用Java进行XML文件的读取与写入,重点介绍DOM(Document Object Model)方式的操作。 #### DOM解析XML...

    使用SAX解析XML文件个人总结

    3. **创建自定义Handler**:定义一个类继承自`org.xml.sax.helpers.DefaultHandler`,并重写其中的方法以实现对XML文件的解析。 ```java class PersonParser extends DefaultHandler { // 重写方法... } ``` 4...

Global site tag (gtag.js) - Google Analytics