javaweb(一):sax解析xml

原创 2015年07月07日 01:14:32

需要两个组件:解析器和事件处理器

解析器逐行扫描文档,每次扫描都会触发事件处理器中的方法。

优点:不需要等待整个xml加载到内存,当解析到某一部分时,自动触发对应的方法去处理;不需要将整个文档加载到内存中;无论多大的xml,理论上都可以解析。

 缺点:每次解析都只能处理一次, 下次再想处理还要重新解析;只能进行查询,不能进行删改查的操作。

xml文件

<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?>
<书架>
	<书>
		<书名>JAVA教程</书名>
		<作者>boucher</作者>
		<售价>39.90</售价>
	</书>
	<书>
		<书名>数据结构</书名>
		<作者>joaner</作者>
		<售价>40.00</售价>
	</书>
</书架></span>

解析过程

第1-3步:

<span style="font-size:18px;">		//1、获取解析器工厂
		SAXParserFactory factory = SAXParserFactory.newInstance();
		//2、通过工厂获取sax解析器
		SAXParser parser = factory.newSAXParser();
		//3、获取读取器
		XMLReader reader = parser.getXMLReader();</span>

第4步:

<span style="font-size:18px;">reader.setContentHandler(/*自己选择*/);</span>

注册事件处理器,可以自己编写一个类实现ContentHandler接口,也可以直接new出来。

该接口中的主要方法有

<span style="font-size:18px;">			@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("开始标签");				
			}
			@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("结束标签");				
			}
			@Override
			public void endDocument() throws SAXException {
				System.out.println("结束解析");				
			}</span>

实例

打印上述xml文件的第二本书的书名

<span style="font-size:18px;">	private String  name = null;
	private int count = 0;
	
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes atts) throws SAXException {
		this.name = qName;
	}

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

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

其中在endElement方法中将name置为null,是为了防止打印出结束标签</书名>后面的回车换行制表符。



XML解析之SAX解析过程代码详解

上一篇谢了解析原理和过程,这里应用代码直观认识这个原理: 新建Demo1类: import java.io.File; import javax.xml.parsers.SAXParser; ...
  • qq_32059827
  • qq_32059827
  • 2016年05月31日 13:12
  • 1013

XML解析(一),SAX解析XML

一、概述 SAX,全称Simple API for XML,是一种以事件驱动的XMl API,是XML解析的一种新的替代方法,解析XML常用的还有DOC解析,PULL解析(Android特有),SAX...
  • ydxlt
  • ydxlt
  • 2015年12月05日 09:38
  • 15758

Java解析xml文档之SAX解析

sax解析是一种边读边解析,仅向前读取,不能修改,用来读。sax创建XMLReader三步:SAXParserFactory factory = SAXParserFactory.newInstanc...
  • new___Smile
  • new___Smile
  • 2016年07月16日 00:59
  • 4139

使用SAX方式解析XML

一、创建XML文件 目录结构: 二、新建一个带有main方法的类(SAXTest.java)public class SAXTest { public static void main(S...
  • L_in12
  • L_in12
  • 2016年07月13日 14:17
  • 5069

XML解析之一——SAX解析详解

SAX解析 XML文档 Java Web
  • feichexia
  • feichexia
  • 2010年12月10日 17:19
  • 2292

Xml解析之Sax解析(传入xml即可得到实体类集合)

[toc] 之前想写一个JAXB解析xml与实体类转换的,但是发现JAXB有一定的局限性,有时,在解析非标准xml中的属性值时,不能够获取到其中的值,很奇怪的是,JAXB是jdk中自带的API,竟然...
  • zml_2015
  • zml_2015
  • 2017年04月09日 20:19
  • 852

android中使用SAX解析xml(封装)

SAX具体怎么用就不说了,网上搜搜一大片。 第一步:建立公共抽象类BaseHandler package com.dc.handler; import java.io.StringRead...
  • gundumw100
  • gundumw100
  • 2017年04月10日 18:08
  • 269

理解SAX解析xml的工作原理

摘要: SAX以事件流来解析xml,边读边触发事件函数完成解析,适用于较大XML; DOM加载整个xml文件,最终在内存中创建一个DOM树,适合小XML文件,操作DOM节点比较简便。 dom比较好理解...
  • u011854789
  • u011854789
  • 2017年01月02日 16:17
  • 1115

利用Dom,Sax,Pull三种方式解析xml文件

最近找工作,看到许多公司的要求里都写了要会xml解析,所以就把之前的xml解析知识又重新回顾了一下,写个小例子. 解析xml文件常用的几种方式也就dom,sax,pull了,并且面试官经常问到的也是这...
  • qiang_xi
  • qiang_xi
  • 2015年11月29日 20:15
  • 1213

XML解析之sax解析案例(二)使用sax解析把 xml文档封装成对象

Demo1类: import java.io.File; import java.util.List; import javax.xml.parsers.SAXParser; import ja...
  • qq_32059827
  • qq_32059827
  • 2016年05月31日 14:11
  • 888
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:javaweb(一):sax解析xml
举报原因:
原因补充:

(最多只允许输入30个字)