[JAVA100例]069、使用SAX解析XML

ReadXmlDemo.java
import java.io.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
public class ReadXmlDemo extends DefaultHandler {
public static void main(String[] arguments) {
    if (arguments.length > 0){
   ReadXmlDemo read = new ReadXmlDemo(arguments[0]);
} else {
   System.out.println("Usage: java ReadXmlDemo filename");
}
  }
ReadXmlDemo(String xmlFile) {
    File input = new File(xmlFile);
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
try {
   SAXParser sax = factory.newSAXParser();
   sax.parse(input, new XmlHandler() );
} catch (ParserConfigurationException pce) {
   System.out.println("Could not create that parser.");
   System.out.println(pce.getMessage());
} catch (SAXException saxe) {
   System.out.println("Problem with the SAX parser.");
   System.out.println(saxe.getMessage());
} catch (IOException ioe) {
   System.out.println("Error reading file.");
   System.out.println(ioe.getMessage());
}
  }
}
class XmlHandler extends DefaultHandler {
  static int READING_NAME = 1;
  static int READING_SEX = 2;
  static int READING_BIRTH = 3;
  static int READING_NOTHING = 0;
  int currentActivity = READING_NOTHING;
  ReadXml xml = new ReadXml();
XmlHandler() {
    super();
  }
public void startElement(String uri, String localName, String qName, Attributes attributes) {
 
    if (qName.equals("title"))
      currentActivity = READING_NAME;
else if (qName.equals("file"))
   currentActivity = READING_SEX;
//else if (qName.equals("Birth"))
   //currentActivity = READING_BIRTH;
  }
public void characters(char[] ch, int start, int length) {
    String value = new String(ch, start, length);
if (currentActivity == READING_NAME)
   xml.name = value;
if (currentActivity == READING_SEX)
   xml.sex = value;
//if (currentActivity == READING_BIRTH)
   //xml.birth = value;
  }
public void endElement(String uri, String localName, String qName) {
    if (qName.equals("page")) {
   System.out.println("\nName: "+xml.name);
   System.out.println("Sex: "+xml.sex);
   //System.out.println("Birth: "+xml.birth);
   xml = new ReadXml();
}
  }
}
class ReadXml {
  String name;
  String sex;
  String birth;
}
SaxParsePage.java
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import java.io.*;
/**
* <p>Title: 使用SAX解析XML</p>
* <p>Description: 使用SAX接口解析book.xml文件</p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Filename: SaxParsePage.java</p>
* @version 1.0
*/
public class SaxParsePage extends DefaultHandler {
/**
*<br>方法说明:主方法,声明解析工厂和加载XML文件
*<br>输入参数:
*<br>返回类型:
*/
 public static void main(String[] argv) {
  try {
   //建立SAX解析工厂
   SAXParserFactory spfactory = SAXParserFactory.newInstance();
   //生成SAX解析对象
   SAXParser parser = spfactory.newSAXParser();
   //指定XML文件,进行XML解析
   parser.parse(new File("book.xml"), new SaxParsePage());
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
/**
*<br>方法说明:文件打开时调用
*<br>输入参数:
*<br>返回类型:
*/
 public void startDocument() {
  System.out.println("***开始解析***");
 }
/**
*<br>方法说明:当遇到开始标记时调用
*<br>输入参数:
*<br>返回类型:
*/
 public void startElement(String uri,
              String localName,
              String qName,
              Attributes attributes) throws SAXException {
System.out.println("节点开始:" + qName);
  for(int i=0;i<attributes.getLength();i++){
   System.out.println("节点属性名称:" + attributes.getQName(i));
   System.out.println("节点属性值:"+attributes.getValue(i));
  }
 }
/**
*<br>方法说明:当分析器遇到无法识别为标记或者指令类型字符时调用
*<br>输入参数:
*<br>返回类型:
*/
 public void characters(char[] ch,
             int offset,
             int length) throws SAXException{
System.out.println("节点数据:" + new String(ch, offset, length));
 }
/**
*<br>方法说明:当遇到节点结束时调用
*<br>输入参数:
*<br>返回类型:
*/
 public void endElement(String uri,
             String localName,
             String qName) {
System.out.println("节点结束:" + qName);
 }
/**
*<br>方法说明:当到文档的末尾调用
*<br>输入参数:
*<br>返回类型:
*/
 public void endDocument() {
  System.out.println("****文件解析完毕****");
 }
}

时间: 2024-10-15 02:05:43

[JAVA100例]069、使用SAX解析XML的相关文章

SAX解析XML文件

就目前来说,有三种方式可以解析XML文件:DOM.SAX.StAX.DOM将整个XML文件加载到内存中,并构建出节点树:应用程序可以通过遍历节点树的方式来解析XML文件中的各个节点.属性等信息:这种方式便于对XML节点的添加修改等,而且解析也很方便,然后它比较耗费内存,解析速度也不快.SAX则是基于事件的解析,解析器在一次读取XML文件中根据读取的数据产生相应的事件,由应用程序实现相应的事件处理逻辑,即它是一种"推"的解析方式:这种解析方法速度快.占用内存少,但是它需要应用程序自己处理

java-求助SAX解析XML时为什么不加上stack.pop()无法打印出元素文本内容?

问题描述 求助SAX解析XML时为什么不加上stack.pop()无法打印出元素文本内容? package com.shengsiyuan.xml.sax; import java.io.File; import java.util.Stack; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.s

android开发-sax解析xml,Tag的设置

问题描述 sax解析xml,Tag的设置 Tag在startElement方法执行后变为book,那在character方法中是如何判断preTag的? public void startDocument() throws SAXException { books = new ArrayList(); } @Override public void startElement(String uri, String localName, String qName, Attributes attrib

Android使用SAX解析XML

SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备. SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件.所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口.下面是一些ContentHandler接口常用的方法: startDocument() 当遇到文档的开头的时候,调用这

详解android使用SAX解析XML文件_Android

解析XML的方式有很多种,大家比较熟悉的可能就是DOM解析. DOM(文件对象模型)解析:解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以根据DOM接口来操作这个树结构了. 优点:整个文档读入内存,方便操作:支持修改.删除和重现排列等多种功能. 缺点:将整个文档读入内存中,保留了过多的不需要的节点,浪费内存和空间. 使用场合:一旦读入文档,还需要多次对文档进行操作,并且在硬件资源充足的情况下(内存,CPU). 为了解决DOM解析存在的问题,就出现了SAX解析.其特点为: 优点:不

Android中使用sax解析xml文件的方法_Android

SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备. SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML 语法中的某部分,如果符合就会触发事件.所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口.下面是一些ContentHandler接口常用的方法: startDocument():当遇到文档的开头的时候,调用

Android编程使用sax解析xml数据的方法详解

本文实例讲述了Android编程使用sax解析xml数据的方法.分享给大家供大家参考,具体如下: 随着技术的发展,现在的web已经和以前不同了.web已经逐渐像移动的方向倾斜,作为程序员的确应该拓展一下自己的知识层面.学习各方面的知识,今天就接着前几天的弄一下Android的xml解析,这次就使用sax的方式解析xml.下面就一步一步的来做吧. 1. 编写一个简单的xml <?xml version="1.0" encoding="UTF-8"?> &l

SAX解析XML 详解

JAVA 解析 XML 通常有两种方式,DOM 和 SAX.DOM 虽然是 W3C 的标准,提供了标准的解析方式,但它的解析效率一直不尽如人意,因为使用DOM解析XML时,解析器读入整个文档并构建一个驻留内存的树结构(节点树),然后您的代码才可以使用 DOM 的标准接口来操作这个树结构.但大部分情况下我们只对文档的部分内容感兴趣,根本就不用先解析整个文档,并且从节点树的根节点来索引一些我们需要的数据也是非常耗时的. SAX是一种XML解析的替代方法.相比于文档对象模型DOM,SAX 是读取和操作

[Java开发之路](11)SAX解析XML文档

1. 简介 Dom解析功能强大,可增删改查,操作时会将XML文档读到内存,因此适用于小文档: SAX解析是从头到尾逐行逐个元素解析,修改较为不便,但适用于只读的大文档: SAX采用事件驱动的方式解析XML.套用网友的解释:如同在电影院看电影一样,从头到尾看一遍,不能回退(Dom可来来回回读取),在看电影的过程中,每遇到一个情节,都会调用大脑去接收处理这些信息.SAX也是相同的原理,每遇到一个元素节点,都会调用相应的方法来处理.在SAX的解析过程中,读取到文档开头.文档结尾,元素的开头和元素结尾都