XML(三)Sax解析XML

 

两种解析方式:

dom4j 和 sax

解析思想:

book2.xml

<?xml version="1.0" encoding="UTF-8"?>

<书架>
  <书>
    <书名>JAVA</书名>
    <作者>XXXXXX</作者>
    <售价>23333</售价>
  </书>
  <书>
    <书名>ANDROID</书名>
    <作者>XXXXXX</作者>
    <售价>23333</售价>
  </书>
</书架>

利用Sax解析book2.xml文件

public class SaxDemo {

	public static void main(String[] args) throws Exception {
		// 获取解析器工厂
		SAXParserFactory factory = SAXParserFactory.newInstance();
		// 通过工厂来获取sax解析器
		SAXParser parser = factory.newSAXParser();
		// 获取读取器
		XMLReader reader = parser.getXMLReader();
		// 注册事件处理器
		reader.setContentHandler(new MyContentHandler1());
		// 解析xml
		reader.parse("book2.xml");

	}
}

class MyContentHandler1 implements ContentHandler {

	@Override
	public void startDocument() throws SAXException {
		System.out.println("文档解析开始");
	}

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes atts) throws SAXException {
		System.out.println("发现开始标签..." + qName);
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		System.out.println(new String(ch, start, length));
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		System.out.println("发现结束标签..." + qName);
	}

	@Override
	public void endDocument() throws SAXException {
		System.out.println("文档解析结束");
	}

	/********************************************************************/
	@Override
	public void setDocumentLocator(Locator locator) {
		// TODO Auto-generated method stub

	}

	@Override
	public void startPrefixMapping(String prefix, String uri)
			throws SAXException {
		// TODO Auto-generated method stub

	}

	@Override
	public void endPrefixMapping(String prefix) throws SAXException {
		// TODO Auto-generated method stub

	}

	@Override
	public void ignorableWhitespace(char[] ch, int start, int length)
			throws SAXException {
		// TODO Auto-generated method stub

	}

	@Override
	public void processingInstruction(String target, String data)
			throws SAXException {
		// TODO Auto-generated method stub

	}

	@Override
	public void skippedEntity(String name) throws SAXException {
		// TODO Auto-generated method stub

	}

}

解析结果:

这样的结果是将整个xml文档都解析出来了,如何获得文档中的某一个标签体呢?

获得第二本书的书名 ,也就是ANDROID

public class SaxDemo {

	public static void main(String[] args) throws Exception {
		// 获取解析器工厂
		SAXParserFactory factory = SAXParserFactory.newInstance();
		// 通过工厂来获取sax解析器
		SAXParser parser = factory.newSAXParser();
		// 获取读取器
		XMLReader reader = parser.getXMLReader();
		// 注册事件处理器
		reader.setContentHandler(new MyContentHandler2());
		// 解析xml
		reader.parse("book2.xml");

	}
}

class MyContentHandler2 extends DefaultHandler {
	private String name = null;
	int count = 0;

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		this.name = qName;
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		if ("书名".equals(name) && count++ == 1) {
			System.out.println(new String(ch, start, length));
		}
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		name = null;
	}

}

结果:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 17:33:58

XML(三)Sax解析XML的相关文章

XML学习笔记(二):使用 DOM和SAX 解析XML :

一.XML解析的简介 1.一般来说xml解析的方式有两种,Dom与SAX,且各有优缺点.pull是第三种方法见:pull解析XML 1)DOM:dom对象树 ①.整个XML放入内存,转换为Document对象: ②.每个元素,转换成Element对象 ③.文本,转换成Text对象 ④.属性,转换成Attribute对象 优缺点:元素的CRUD比较简单,但是内存消耗大,大的xml文档不适合. 补充:内存不足时,可以修改参数,调整JVM的内存大小 1.java.lang.OutOfMemoryErr

android学习二十二(使用SAX解析xml)

上一篇博客是使用Pull解析xml文件的,Pull解析方式虽然非常好用,但它并不是我们唯一的选择.SAX解析也是一种特别常用的XML解析方式,虽然它的用法比Pull解析复杂,但在语义方面会更加的清楚. 通常情况下我们都会新建一个类继承自DefaultHandler,并重写父类的五个方法,如下所示: package com.jack.networktest; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import

Python:使用基于事件驱动的SAX解析XML

SAX的特点: 是基于事件的 API 在一个比 DOM 低的级别上操作 为您提供比 DOM 更多的控制 几乎总是比 DOM 更有效率 但不幸的是,需要比 DOM 更多的工作 基于对象和基于事件的接口 您可能已经知道语法分析器有两类接口 - 基于对象的(如:DOM)和基于事件(如:SAX)的接口. DOM是基于对象的语法分析器的标准 API. 作为基于对象的接口,DOM 通过在内存中显示地构建对象树来与应用程序通信.对象树是 XML 文件中元素树的精确映射. DOM 易于学习和使用,因为它与基本

cocos2d-x 3.0 使用Sax解析xml文档(解决中文显示问题)

今天是个好日子,心想的事儿都能成,明天是个好日子,打开了家门儿迎春风... 恩,听着歌写文档生活就是这么享受. 今天以前的邻居大神突然在qq上赞了我一下,这让我异常激动啊..这还要从前前前几天说起,那会无意间看到cocos微信上的一个实话实说活动,反正就是参加了可以抽奖这样子啦,没错,我就是本着那官方T恤去的,本着分子越大分母越大抽奖几率越大的原则,然后就连着发了一番感慨,而且还都是比较罗嗦,没想到隔天cocos君竟然给我回复了,中奖了有木有,cocos2dx的官方T恤,哈哈..然后就是以前的大

SAX解析XML的过程

SAX解析XML的过程 SAX解析XML的过程:---------------------------一行一行的读,触发事件.(这个XML文档没有加载到内存中) 第一步:当遇到元素的开始标记的时候执行startElement方法 第二步:接着执行characters方法 第三步:当遇到元素的结束标记的时候执行endElement方法(在这要特别注意......因为下面方法又会把value设为空) 第四步:接着执行characters方法 第五步:......循环......直接扫描到文件结束

cocos2d-x 3.0 使用Sax解析xml文件(中国显示器问题解决)

今天是个好日子.我以为事情可以变得,明天是个好日子.打开门儿春风... 恩,听着歌写文档生活就是这么享受. 今天曾经的邻居大神突然在qq上赞了我一下,这让我异常激动啊.. 这还要从前前前几天说起,那会无意间看到cocos微信上的一个实话实说活动.反正就是參加了能够抽奖这样子啦.没错.我就是本着那官方T恤去的,本着分子越大分母越大抽奖几率越大的原则,然后就连着发了一番感慨.并且还都是比較罗嗦,没想到隔天cocos君居然给我回复了,中奖了有木有,cocos2dx的官方T恤,哈哈. .然后就是曾经的大

安卓SAX解析XML文件

XML文件常用的解析方式有DOM解析,SAX解析. 一.Sax SAX(simpleAPIforXML)是一种XML解析的替代方法.相比于DOM,SAX是一种速度更快,更有效的方法.它逐行扫描文档,一边扫描一边解析.而且相比于DOM,SAX可以在解析文档的任意时刻停止解析,但任何事物都有其相反的一面,对于SAX来说就是操作复杂.SAX解析XML文档采用事件驱动模式.什么是事件驱动模式?它将XML文档转换成一系列的事件,由单独的事件处理器来决定如何处理.基于事件驱动的处理模式主要是基于事件源和事件

SAX解析XML

SAX 事件处理(事件驱动),不需要载入整个文档,流机制读取,分析XML文档 startDocument startElement character endElement endDocument 当sax扫描到文档时就调用startDocument函数,sax扫描到文档结束符时就调用endDocument函数,也就是说当sax扫描到哪个节点时就会调用相应的函数,同时还会携带节点的属性值. 当它扫描到节点内容值时就会调用character函数 Sax主要是用来对xml文件遍历,解析,不提供修改.

6. SAX解析XML

SAX解析: SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分: 解析器和事件处理器 : 1. 解析器可以使用SAXP的API创建,创建出SAX解析器后, 就可以指定解析器去解析某个XML文档. 解析器采用SAX方式在解析某个XML文档时, 它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法, 解析器在调用事件处理器的方法时, 会把当前解析到的xml文件内容作为方法的参数传递给事件处理器. 2. 事件处理器由程序员编写,程序员通过事件处理器