`

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

		}
	}
}
分享到:
评论

相关推荐

    java解析xml数据---sax解析器

    以下是使用SAX解析XML的基本步骤: 1. 创建一个实现DefaultHandler或ContentHandler接口的类,重写其中的方法,如startElement()、endElement()和characters(),用于处理XML文档的结构和数据。 2. 实例化SAX解析器...

    读取RSS-SAX解析XML实例(java版)

    标题"读取RSS-SAX解析XML实例(java版)"所涉及的知识点主要集中在两个方面:一是如何读取RSS(Really Simple Syndication)数据,二是使用SAX解析XML文件。 RSS是一种用于发布新闻、博客和其他定期更新内容的格式...

    SAX解析XML文件实例

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

    android----xml Sax解析示例

    以下是一个简单的SAX解析示例: ```java import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class MySaxHandler extends DefaultHandler { @...

    android学习笔记1--SAX解析XML

    下面是一段示例代码,展示了如何使用SAX解析XML: 1. **创建SAX解析器工厂**:首先需要创建一个SAX解析器工厂实例。 ```java SAXParserFactory factory = SAXParserFactory.newInstance(); ``` 2. **获取...

    dom-sax解析XML文件-java

    而SAX解析示例则相对复杂,需要创建事件处理器类: ```java import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SAXExample extends ...

    Java SAX解析Xml文档Demo

    本示例将详细解释如何在Java中使用SAX解析XML文档,并通过注释进行详细说明。 首先,我们需要引入SAX解析器的依赖库,通常这可以通过在项目构建配置中添加JAXB或Xerces实现来实现。 ```java // 引入必要的库,如...

    Android网络之数据解析----SAX方式解析XML数据

    四、SAX解析XML示例 ```java import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class MyContentHandler extends DefaultHandler { @...

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

    "sax_xml sax_解析_xml"标签表明了本压缩包包含使用SAX解析XML的示例代码。 3. **JDOM**:JDOM是一个Java API,专门用于读写XML文档。它提供了一个更面向Java的对象模型,使得XML处理更加直观。JDOM在DOM的基础上...

    java sax 解析xml

    下面将详细介绍Java SAX解析XML的相关知识点。 1. **SAX解析原理**: - SAX解析器读取XML文件,遇到每个元素、属性、文本等,都会触发一个相应的事件。 - 应用程序通过实现SAX解析器的回调接口,定义处理这些事件...

    sax解析xml文件

    在本项目中,"saxloadxml"应该是实现了一个SAX解析XML文件的示例,旨在帮助开发者理解和应用SAX解析。 首先,我们需要理解SAX解析的基本原理。当解析器读取XML文件时,它会触发一系列的事件,如开始文档、结束文档...

    JAVA解析XML示例

    在Java中,`org.xml.sax.helpers.DefaultHandler`和`org.xml.sax.XMLReader`类是SAX解析的核心。 3. DOM4J解析: DOM4J是一个开源的Java库,提供了一种灵活且功能强大的API来处理XML、XPath和XSLT。它扩展了DOM模型...

    SAX解析XML实例

    总的来说,SAX解析XML是一种高效且灵活的方法,适用于处理大型XML文档。通过自定义事件处理器,我们可以根据业务需求定制解析逻辑,从而有效地解析和利用XML数据。在实际项目中,结合源码分析和工具使用,如IDE中的...

    SAX解析超大XML文件 示例代码

    以下是一个简单的SAX解析超大XML文件的Java示例代码: ```java import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers....

    java Sax解析Xml

    以下是一个简单的SAX解析XML的Java示例: ```java import org.xml.sax.XMLReader; import org.xml.sax.InputSource; import org.xml.sax.helpers.DefaultHandler; public class SaxDemo { public static void ...

    jsp操作xml源码,解析器为DOM和SAX

    在IT行业中,XML(eXtensible Markup Language)是一种用于存储和传输数据的标准化格式,因其结构清晰、...对于初学者来说,这是一个很好的起点,可以结合实际项目需求,灵活运用DOM和SAX解析XML,提升自己的编程能力。

    javaSAX方式解析xml文档

    Java SAX方式解析XML文档是一种高效的处理大型XML文件的方法,它基于事件驱动模型,不将整个XML文档加载到内存中,而是逐个处理XML元素。这种方式非常适合处理大文件,因为它节省了内存,但需要编写更多的代码来处理...

    JAVA -XML解析总结

    2. SAX解析: SAX 是一种基于事件驱动的解析方式,它不会将整个 XML 文档加载到内存。当解析器遇到 XML 文档中的特定事件(如元素开始、结束等)时,会触发回调函数,由用户定义的事件处理器执行相应操作。这种方式...

    SAX解析XML

    **SAX解析XML详解** XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置文件和Web服务等领域。SAX(Simple API for XML)是XML解析的一种方式,它采用事件驱动模型,以流式处理...

    sax解析xml本地读取xml

    以下是一个简单的SAX解析XML文件的Java代码示例: ```java import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler;...

Global site tag (gtag.js) - Google Analytics