`

java-SAX解析XML示例

    博客分类:
  • java
阅读更多
   JAVA 解析 XML 通常有两种方式:DOM 和SAX。DOM(文档对象模型)是W3C标准,提供了标准的解析方式,但其解析效率一直不尽如人意,这是因为DOM解析XML文档时,把所有内容一次性的装载入内存,并构建一个驻留在内存中的树状结构(节点数)。如果需要解析的XML文档过大,或者我们只对该文档中的一部分感兴趣,这样就会引起性能问题。
   SAX(simple API for XML)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM,SAX可以在解析文档的任意时刻停止解析,但任何事物都有其相反的一面,对于SAX来说就是操作复杂。

    SAX采用事件处理的方式解析XML文件,通常涉及两个部分:解析器和事件处理器:
——解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。
——事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。

package cd.itcast.day3;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SaxParserDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		saxParse();
	}

	public static void saxParse() {
		// 得到SAX解析工厂实例
		SAXParserFactory spf = SAXParserFactory.newInstance();
		try {
			// 得到SAX解析器
			SAXParser sp = spf.newSAXParser();
			// 得到XML读取器
			// XMLReader xr = sp.getXMLReader();
			// 设置XML内容处理器
			// xr.setContentHandler(new MyContentHandler());
			// xr.parse("D:\\Java\\WorkSpace\\JavaDemo\\src\\cd\\itcast\\day3\\student.xml");
			
			List<Student> list = new ArrayList<Student>();
			
			//直接采用SAX解析器的解析方法,传入一个DefaultHandler实例
			sp.parse(
					"D:\\Java\\WorkSpace\\JavaDemo\\src\\cd\\itcast\\day3\\student.xml",
					new MyDefaultHander(list));

			for (Student stu : list) {
				System.out.println(stu);
			}
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	//DefaultHandler实现了ContentHandler的方法,因此可以声明一个类继承DefaultHandler,并覆盖我们需要的方法即可.
	static class MyDefaultHander extends DefaultHandler {
		// 通过够咱函数传递给内部的List,接收解析出来的Student内容.
		private List<Student> stuList = null;
		
		// 定义一个标记,获取元素的标签名,根据标签名称做不同的处理.
		private String tagName = null;
		//Student实例,每解析出一个student元素,将解析出来的内容设置到stu对象,并添加到list中.
		private Student stu = null;

		public MyDefaultHander(List<Student> stuList) {
			this.stuList = stuList;
		}

		@Override
		public void startDocument() throws SAXException {
			// TODO Auto-generated method stub
			System.out.println("文档开始");
		}

		@Override
		public void endDocument() throws SAXException {
			// TODO Auto-generated method stub
			System.out.println("文档结束");
		}

		@Override
		public void startElement(String uri, String localName, String qName,
				Attributes atts) throws SAXException {
			// TODO Auto-generated method stub
			// System.out.println("元素开始:" + qName);
			tagName = qName; // 元素一开始,记录标记
			if ("student".equals(qName)){
				stu = new Student();
				stu.setId(Integer.parseInt(atts.getValue("id")));
			}
		}

		@Override
		public void endElement(String uri, String localName, String qName)
				throws SAXException {
			// TODO Auto-generated method stub
			// System.out.println("元素结束:" + qName);
			tagName = null; // 清空标记
			if ("student".equals(qName)){
				stuList.add(stu);
			}
		}

		@Override
		public void characters(char[] ch, int start, int length)
				throws SAXException {
			// TODO Auto-generated method stub
			// System.out.println("开始处理字符:" + new String(ch, start, length));
			if ("name".equals(tagName)) {
				stu.setName(new String(ch, start, length));	
			}
			else if ("sex".equals(tagName)) {
				stu.setSex(new String(ch, start, length));
			}
			else if ("age".equals(tagName)) {
				stu.setAge(Integer.parseInt(new String(ch, start, length)));	
			}
		}
	}

	//采用XMLReader必须要覆盖ContentHandler的方法,不方便.
	static class MyContentHandler implements ContentHandler {
		@Override
		public void setDocumentLocator(Locator locator) {
			// TODO Auto-generated method stub

		}

		@Override
		public void startDocument() throws SAXException {
			// TODO Auto-generated method stub
			System.out.println("文档开始");
		}

		@Override
		public void endDocument() throws SAXException {
			// TODO Auto-generated method stub
			System.out.println("文档结束");
		}

		@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 startElement(String uri, String localName, String qName,
				Attributes atts) throws SAXException {
			// TODO Auto-generated method stub
			System.out.println("元素开始:" + qName);
		}

		@Override
		public void endElement(String uri, String localName, String qName)
				throws SAXException {
			// TODO Auto-generated method stub
			System.out.println("元素结束:" + qName);
		}

		@Override
		public void characters(char[] ch, int start, int length)
				throws SAXException {
			// TODO Auto-generated method stub
			System.out.println("开始处理字符:" + new String(ch, start, length));
		}

		@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

		}
	}
}
分享到:
评论

相关推荐

    SAX解析XML文件实例

    SAX解析XML文件的实例。一个项目同时用dom解析和sax解析xml文件貌似会报错,项目框架建一直是用sax和dom4j解析xml文件的。当我用dom解析xml文件。导入包后就报错识别不了xml文件的编码格式。于是做了一个sax解析xml...

    dom-sax解析XML文件-java

    java中dom解析和sax解析xml文件对比示例!

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

    使用java语言对XML文档进行解析的示例,包括DOM,SAX方式,并包括使用jdom和jom4j框架进行XML解析或生成XML文档

    java解析xml之sax解析xml示例分享

    SAX基于事件的解析,解析器在一次读取XML文件中根据读取的数据产生相应的事件,由应用程序实现相应的事件处理逻辑,即它是一种“推”的解析方式;这种解析方法速度快、占用内存少,但是它需要应用程序自己处理解析器...

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

    学习xml——sax解析的项目小示例 非常简单易懂 而且包括多种sax解析的方法 如xmlReader,saxBuilder工厂,还包括一个dom解析的示例(DocumentBuilder工厂)

    JAVA解析XML

    JAVA常用的四种解析XML的示例,包括sax、dom、dom4j与jdom

    java 4种方式 解析 xml

    java 4 种方式解析 和 创建 xml 文件 源码示例。 1.dom方式。 2.sax方式。 3.dom4j方式。 4.jdom方式。 里面的工程包源码 和 相应的 lib jar,倒入后就可以 测试。 欢迎下载分享传播。

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    3.3.6 使用sax解析xml文档实例 74 3.4 jdom 83 3.4.1 下载并配置jdom 83 3.4.2 jdom api介绍 84 3.5 dom4j 88 3.5.1 下载并配置dom4j 88 3.5.2 dom4j api介绍 88 3.5.3 第一个实例 92 3.5.4 第二个实例 94 ...

    java解析xml的四种方式

    java解析xml的四种方式(包括dom4j解析和jdom解析,以及示例代码)

    XML必知必会:Java、C#、Python多种语言解析XML文档

    解析XML文档概述、DOM解析XML、SAX解析XML 第8章 Java语言解析XML DOM4J概述、示例:遍历节点、示例:插入节点、示例:删除节点 第9章 Python语言解析XML ElementTree模块概述、示例:遍历节点、示例:插入节点、...

    XML示例程序导学(第二版)

    前11章对XML与HTML的关系与差异、名称空间、DTD、模式、样式表、解析器、XSL、DOM、SAX、XLink、XPointer、SOAP等做了全面详尽的阐述,最后一章综合讨论了一完整的电子商务实例。附录A“Java速成”提供了理解本书...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    3.3.6 使用sax解析xml文档实例 74 3.4 jdom 83 3.4.1 下载并配置jdom 83 3.4.2 jdom api介绍 84 3.5 dom4j 88 3.5.1 下载并配置dom4j 88 3.5.2 dom4j api介绍 88 3.5.3 第一个实例 92 3.5.4 第二个实例 94 ...

    java-json-examples:使用Java读取JSON文件的示例

    与XML DOM和SAX解析模式相似,JSON文件也可以在对象模型或流式传输中进行读取。 由于对象模型会解析整个JSON文件并将其加载到内存中,因此非常消耗内存。 另一方面,流模式将文件作为数据流读取,并提供了使用JSON...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    3.3.6 使用sax解析xml文档实例 74 3.4 jdom 83 3.4.1 下载并配置jdom 83 3.4.2 jdom api介绍 84 3.5 dom4j 88 3.5.1 下载并配置dom4j 88 3.5.2 dom4j api介绍 88 3.5.3 第一个实例 92 3.5.4 第二个实例 94 ...

    XML解析Demo

    本示例采用了DOM、SAX、StAX三种方式解析XML,注释相对比较详细。通过Java代码实现的一个解析。

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    3.3.6 使用sax解析xml文档实例 74 3.4 jdom 83 3.4.1 下载并配置jdom 83 3.4.2 jdom api介绍 84 3.5 dom4j 88 3.5.1 下载并配置dom4j 88 3.5.2 dom4j api介绍 88 3.5.3 第一个实例 92 3.5.4 第二个实例 94 ...

    java XML sax parser (2kb)-开源

    这是一个为所有 Java 设备制作的小型 SAX 解析器。 它可以从非常小的设备(从 Midp 到 DoJa 的典型 java 电话)到企业服务器使用。 现在,它仅支持 SAX 解析器模型。 使用非常简单(请参阅 .java 示例)。 提示是

    java中四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)

    本篇文章主要介绍了四种生成和解析XML文档的方法,即:DOM、SAX、JDOM和DOM4J,具有一定的参考价值,有兴趣的可以了解一下。

    Android利用SAX对XML进行增删改查操作详解

    在项目中会遇到对于XML的增删改查,下面这篇文章主要给大家介绍了关于Android利用SAX对XML进行增删改查操作的相关资料,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧。

Global site tag (gtag.js) - Google Analytics