博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SAX解析XML文档特点及样例
阅读量:4212 次
发布时间:2019-05-26

本文共 5022 字,大约阅读时间需要 16 分钟。

原文地址:SAX解析XML文档特点及样例作者:minxinwang88

SAX解析
逐行顺序解析,效率比DOM高。一旦遍历过的元素就无法再遍历。
对于大型的XML采用SAX解析方式来解析。
DOM解析是随机访问的,SAX是顺序访问的
SAX 解析
1. SAX ( Simple Application interface for XML ), 是一组程序设计接口,采用 observer 模式,将XML文件视为一个文字流的数据,在读取XML 元素时触发一系列的事件

2. 使用DOM 时是将xml 文件解析为一个树状结构,并对树中的节点进行操作
使用SAX 加载XML文件时,他的操作像打开一个“顺序的文件字符流”,在读到XML元素的开始标记,结尾标记和内容标记时将产生一系列的事件
如一个简单的XML文件:<hello><message>hello XML!</message></hello>
会相应的触发:startDocument, startElement, characters, endElement, endDocument, 只需编写这些事件处理程序就可以解析XML文件了

3. SAX 可以高效的使用内存,因为SAX 只是顺序的读取XML 文件的内容,并不会将XML 文件完全加载,这样就比DOM 的处理效率高
但SAX 只能读取XML 文件的内容,而不能更改XML 的内容,也不能随机访问XML 元素

4. 在SAX 中有4个处理器是要实现的:ContentHandler,DTDHandler,EntityResolver,ErrorHandler,以处理不同的事件,这是比较麻烦的,
幸好SAX 定义了一个 DefaultHandler 类把这几个实现了,我们只需在 DefaultHandler中定义事件处理方法,然后注册到XMLReader,而SAXParser封装了XMLReader的实现类,
SAXParser又是由SAXParserFactory提供的,所以我们实际用到的类只有:SAXParserFactory,SAXParser,DefaultHandler
DefaultHandler
1)public void startDocument()throws SAXException
接到文档开始通知,空函数,需要重写该函数。
与此对应的方法还有:
public void endDocument()throws SAXException
2)public void startElement(String uri,
                         String localName,
                         String qName,
                         Attributes attributes)
                  throws SAXException
接到元素开始通知,不执行任何操作。子类需要重写该函数
参数:
uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。
3)public void characters(char[] ch,
                       int start,
                       int length)
                throws SAXException
接收元素中字符开始通知
指定者:
接口 ContentHandler 中的 characters
参数:
ch - 字符。
start - 字符数组中的开始位置。
length - 从字符数组中使用的字符数。
4)void endElement(String uri,
                String localName,
                String qName)
                throws SAXException
接收元素结束的通知
参数:
uri - 名称空间 URI,如果元素没有名称空间 URI,或者未执行名称空间处理,则为空字符串
localName - 本地名称(不带前缀),如果未执行名称空间处理,则为空字符串
qName - 限定的 XML 名称(带前缀),如果限定名不可用,则为空字符串

5. SAX 的解析步骤:
(1)写一个类继承 DefaultHandler, 实现自己的事件处理方法
(2)在主程序中建立 SAXParserFactory
(3)可以设置这个factory 的参数
(4)从这个factory 得到SAXParser
(5)解析XML文件

6.样例
需要解析的XML文档
<?xml version="1.0" encoding="UTF-8"?>
<people xmlns:xsi="" xsi:noNamespaceSchemaLocation="F:JAVA_EE教程XML_codePersonInfoSchema.xsd">
<Person PersonId="E01">
<Name>minxin.wang</Name>
<Address>wulumuqi.xinjiang.China</Address>
<Tel>14799297669</Tel>
<Fax>0991-6638770</Fax>
<E-Mail>wang.minxin@zte.com.cn</E-Mail>
</Person>
<Person PersonId="E02">
<Name>huiqiong.zhang</Name>
<Address>miquan.xinjiang.China</Address>
<Tel>18799167160</Tel>
<Fax>0991-3372818</Fax>
<E-Mail>huiqiong.zhang@zte.com.cn</E-Mail>
</Person>
<Person PersonId="E03">
<Name>ping.wang</Name>
<Address>guangdong.xinjiang.China</Address>
<Tel>15816833753</Tel>
<Fax>0991-6638770</Fax>
<E-Mail>wp890510@sina.com.cn</E-Mail>
</Person>
</people>

java程序
package com.sax.xml;

import java.io.IOException;
import java.util.Stack;

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

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

public class sax_demo2
{

public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException
{
// TODO Auto-generated method stub
//step 1:创建工厂
SAXParserFactory factory=SAXParserFactory.newInstance();
//step 2:创建解析器
SAXParser saxparser=factory.newSAXParser();
//step 3:加载xml文档,进行解析
saxparser.parse("PersonInfoSchema.xml", new MyHandler2());
}

}

//创建XML的处理类,必须继承DefaultHandler
class MyHandler2 extends DefaultHandler
{
private Stack<String> stack=new Stack<String>();
private String name;
private String address;
private String tel;
private String fax;
private String email;
@Override
public void startDocument() throws SAXException
{
// TODO Auto-generated method stub
super.startDocument();
}
//对元素和属性的处理
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException
{
// TODO Auto-generated method stub
stack.push(qName);
for(int i=0;i<attributes.getLength();i++)
{
System.out.println("attrName: "+attributes.getQName(i));
System.out.println("attrValue: "+attributes.getValue(i));
}
}
//对元素中的字符进行处理
@Override
public void characters(char[] ch, int start, int length)
throws SAXException
{
// TODO Auto-generated method stub
String tag=stack.peek();
if("Name".equals(tag))
{
name=new String(ch,start,length);
}
else if("Address".equals(tag))
{
address=new String(ch,start,length);
}
else if("Tel".equals(tag))
{
tel=new String(ch,start,length);
}
else if("Fax".equals(tag))
{
fax=new String(ch,start,length);
}
else if("E-Mail".equals(tag))
{
email=new String(ch,start,length);
}
}
//接到元素结尾通知,对元素中的内容进行处理
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException
{
stack.pop();
if("Person".equals(qName))
{
System.out.println("姓名:"+name);
System.out.println("地址:"+address);
System.out.println("电话:"+tel);
System.out.println("传真:"+fax);
System.out.println("电邮:"+email);
System.out.println();
}
}
@Override
public void endDocument() throws SAXException
{
// TODO Auto-generated method stub
super.endDocument();
}
}

转载地址:http://bizmi.baihongyu.com/

你可能感兴趣的文章
5.PyTorch实现逻辑回归(二分类)
查看>>
6.PyTorch实现逻辑回归(多分类)
查看>>
8.Pytorch实现5层全连接结构的MNIST(手写数字识别)
查看>>
9.PyTorch实现MNIST(手写数字识别)(2卷积1全连接)
查看>>
hdu 3460 Ancient Printer(trie tree)
查看>>
中间数
查看>>
KMP求前缀函数(next数组)
查看>>
KMP
查看>>
poj 3863Business Center
查看>>
Android编译系统简要介绍和学习计划
查看>>
Android编译系统环境初始化过程分析
查看>>
user2eng 笔记
查看>>
DRM in Android
查看>>
ARC MRC 变换
查看>>
Swift cell的自适应高度
查看>>
【linux】.fuse_hiddenXXXX 文件是如何生成的?
查看>>
【LKM】整合多个LKM为1个
查看>>
【Windows C++】调用powershell上传指定目录下所有文件
查看>>
Java图形界面中单选按钮JRadioButton和按钮Button事件处理
查看>>
小练习 - 排序:冒泡、选择、快排
查看>>