* 使用Sax解析XML文档
 *

 
* 使用Sax解析文档和DOM解析不一样。
 * 概述:
 * 是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM
 * ,SAX可以在解析文档的任意时刻停止解析,但任何事物都有其相反的一面,对于SAX来说就是操作复杂。。。。。
 * SAX的工作原理:
 * 简单地说就是对文档进行顺序扫描,当扫描到文档
 * (document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数
 * ,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。
 *
 *
 * 和DOM不同的是 SAX需要自己写处理器,处理器分为:(ContentHandeler)内容处理器
 * (ErrorHandler)错误处理器,(DTDHandler)DTD约束处理器, (EntityHandler)实体处理器
 *

* 重要的就是ContentHandler,这里也用内容处理器做例子

XML文档

<?xml version="1.0" encoding="UTF-8" standalone="no"?><书架>
<书>
<书名 name="xxxxx">第一本书</书名>
<作者>六道01</作者>
<售价>100</售价>
</书>
<书>
<书名>第二本书</书名>
<作者>六道02</作者>
<售价>200</售价>
</书>
</书架>

对XML文档进行操作 使用SAX解析

import java.io.IOException;

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.XMLReader;
public class ExSax
{
public static void main(String[] args) throws ParserConfigurationException,
SAXException, IOException
{
// 1,创建解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
// 2,得到解析器
SAXParser sp = factory.newSAXParser();
// 3,得到读取器
XMLReader reader = sp.getXMLReader();
// 4,设置内容处理器
reader.setContentHandler(new ListHandler());
// 5,读取XML文档内容
reader.parse("src/MyBook.xml");
} } class ListHandler implements ContentHandler
{ @Override
public void setDocumentLocator(Locator locator)
{
// TODO Auto-generated method stub } @Override
public void startDocument() throws SAXException
{
// TODO Auto-generated method stub } @Override
public void endDocument() throws SAXException
{
// 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 startElement(String uri, String localName, String qName,
Attributes atts) throws SAXException
{
//将获得的开始标签打印
System.out.println("<"+qName+">");
//atts是标签里面的属性 现在打印他,因为属性可能有好几个所以做循环,但是属性也可能为空所以要判断下
//属性有属性名和值。现在分别获取他们并打印
for(int i = 0; atts!=null && i<atts.getLength();i++)
{
//获得属性名
String attName = atts.getQName(i);
//获得属性值
String attValue = atts.getValue(i);
System.out.println(attName +"" +attValue);
} } //打印结束标签
@Override
public void endElement(String uri, String localName, String qName)
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 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解析 获取指定内容

import java.io.IOException;

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.XMLReader;
import org.xml.sax.helpers.DefaultHandler; /**
* 使用Sax解析XML文档
*
* 获取指定内容
*
* @author Administrator
*
*/
public class ExSax2
{
public static void main(String[] args) throws ParserConfigurationException,
SAXException, IOException
{
// 1,创建解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
// 2,得到解析器
SAXParser sp = factory.newSAXParser();
// 3,得到读取器
XMLReader reader = sp.getXMLReader();
// 4,设置内容处理器
reader.setContentHandler(new TagValueHandler());
// 5,读取XML文档内容
reader.parse("src/MyBook.xml");
} } // 获取指定标签的值,不需要实现接口,重写所有方法,只需要继承接口的子类DefaultHandler
// 覆盖开始标签,结束标签,获取内容方法 就好了
class TagValueHandler extends DefaultHandler
{ // 定义当前标签
private String currentTag;
// 记住想要获取的第几个作者标签的值
private int needNumber = 1;
// 当前解析到的是第几个
private int currentNumber; @Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException
{
// 得到当前标签
currentTag = qName;
// 如果获得到的是作者那么当前解析到的加一
if (currentTag.equals("作者"))
{
currentNumber++;
} } @Override
public void characters(char[] ch, int start, int length)
throws SAXException
{
// 如果标签内容是作者 ,并且是指定的第几个作者,那么将打印作者内容
if ("作者".equals(currentTag) && currentNumber == needNumber)
{
System.out.println(new String(ch, start, length));
} } @Override
public void endElement(String uri, String localName, String qName)
throws SAXException
{
// 最后要将当前标签置空
currentTag = null;
} }

JAXP的SAX解析的更多相关文章

  1. 使用JAXP进行sax解析

    package cn.liuning.sax; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactor ...

  2. XML案例(使用JAXP进行SAX解析)

    1.Book.java package cn.itcast.sax; public class Book { private String name; private String author; p ...

  3. JAXP进行DOM和SAX解析

    1.常用XML的解析方式:DOM和SAX 1)DOM思想:将整个XML加载内存中,形成文档对象,所以对XML操作都对内存中文档对象进行. 2)SAX思想:一边解析,一边处理,一边释放内存资源---不允 ...

  4. 17.JAVA-Dom、Sax解析XML详解

    在JAVA中,解析有三种方式: Dom解析(支持改删,耗内存). Sax解析(不支持改删,不耗内存). Pull解析(在Android中推荐使用的一种解析XML的方式,在下章学习). 1.支持Dom与 ...

  5. 用JAXP的SAX方式解析XML文件

    简单用JAXP的SAX方式(事件驱动)解析XML文件: 文件(1.XML) <?xml version="1.0" encoding="UTF-8" st ...

  6. javaweb学习总结十二(JAXP对XML文档进行SAX解析)

    一:JAXP使用SAX方式解析XML文件 1:dom解析与sax解析异同点 2:sax解析特点 二:代码案例 1:xml文件 <?xml version="1.0" enco ...

  7. XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax

    本文主要涉及:xml概念描述,xml的约束文件,dtd,xsd文件的定义使用,如何在xml中引用xsd文件,如何使用java解析xml,解析xml方式dom sax,dom4j解析xml文件 XML来 ...

  8. 2.2 使用 JAXP 对XML文档进行SAX解析

    使用JAXP 对 XML文档进行 SAX解析: public class Demo1 { /** * 使用JAXP对XML文档进行SAX解析 * @throws Exception * @throws ...

  9. DOM综合案例、SAX解析、StAX解析、DOM4J解析

    今日大纲 1.DOM技术对xml的增删操作 2.使用DOM技术完成联系人管理 3.SAX和StAX解析 4.DOM4J解析 5.XPATH介绍 1.DOM的增删操作 1.1.DOM的增加操作 /* * ...

随机推荐

  1. POJ3233(矩阵二分再二分)

    题目非常有简单: Description Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + ...

  2. c#兼容 PHP中的md5

    原文:c#兼容 PHP中的md5 由于工作需要,需要使用C#去对一个php程序做二次开发.在登录验证的时候,发现一个小问题. 就是用C#写的md5算法得出的结果和php的md5()得出的结果有时候会不 ...

  3. navigator,JS检测浏览器插件

    最早由Netscape Navigator 2.0引入的navigator对象,现在已经成为识别客户端浏览器的事实标准.虽然其它浏览器也通过其它方式提供了相同或相似的信息(例如,IE中的window. ...

  4. C# 对Outlook联系人的增、删、查 

    原文:C# 对Outlook联系人的增.删.查 [转] 注:定义变量 Outlook.Application myOlApp = new Outlook.ApplicationClass(); Out ...

  5. 实例学习SSIS(四)--使用日志记录和错误流重定向

    原文:实例学习SSIS(四)--使用日志记录和错误流重定向 导读: 实例学习SSIS(一)--制作一个简单的ETL包 实例学习SSIS(二)--使用迭代 实例学习SSIS(三)--使用包配置 实例学习 ...

  6. jquery插件推荐

    jQuery 是继 prototype 之后又一个优秀的 Javascript 框架.其宗旨是—写更少的代码,做更多的事情.它是轻量级的 js 库(压缩后只有21k) ,这是其它的 js 库所不及的, ...

  7. 开源Asp.Net MVC网上商城BrnShop

    开源Asp.Net MVC网上商城BrnShop正式发布,提供源码下载 BrnShop网上商城是以Asp.Net mvc3为基础开发的网上商城,源代码完全开源(企业版的源代码目前还没有完全整理完成,一 ...

  8. .NET MVC学习之模型绑定

    ASP.NET MVC学习之模型绑定(2)   继ASP.NET MVC学习之模型绑定继续 3.手工调用模型绑定 很多情况下我们都是通过形参的方式接收来自http流中的数据,这看似是完美的,但是缺少了 ...

  9. rebbitmq-RPC(C#)

    RPC(Remote Procedure Call Protocol)——远程过程调用协议 运行时,一次客户机对服务器的RPC调用,其内部操作大致有如下十步: 1.调用客户端句柄:执行传送参数 2.调 ...

  10. MongoDB应用介绍之前

    MongoDb企业应用实战(一) 写在MongoDB应用介绍之前   故事背景: 本人有幸,经老友( 现为x知名快递公司技术总监 ) 推荐进入中国前三大民营快递公司之一工作,在此非常感谢他,在此也非常 ...