TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
这种处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX 还比它的替代者 DOM 快许多。
选择
DOM 还是选择 SAX ?
对于需要自己编写代码来处理
XML 文档的开发人员来说,选择 DOM 还是 SAX 解析模型是一个非常重要的设计决策。
区别:
DOM 采用建立树形结构的方式访问 XML 文档,而 SAX 采用的事件模型。
DOM 解析器把 XML 文档转化为一个包含其内容的树,并可以对树进行遍历。
用 DOM 解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用 DOM 解析器的时候需要处理整个 XML 文档,所以对性能和内存的要求比较高,尤其是遇到很大的 XML 文件的时候。由于它的遍历能力,DOM 解析器常用于 XML 文档需要频繁的改变的服务中。
SAX 解析器采用了基于事件的模型,它在解析
XML 文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX 对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX 这种扩展能力得到了更好的体现。
但是用 SAX 解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。
准备活动:
- 1. java.util.Stack<E>是java.util.Vector的子类。<E>
复制代码 类表示后进先出(LIFO)的对象堆栈。它通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈。它提供了通常的 push() 和 pop() 操作,以及取栈顶点的 peek() 方法,测试堆栈是否为空的 empty()方法、在堆栈中查找项并确定到栈顶距离的 search 方法。2. org.xml.sax.helpers.DefaultHandler[/code]- public class DefaultHandler
复制代码 extends Object [/code] implements EntityResolver, DTDHandler, ContentHandler, ErrorHandler[/code]
startElement()
;接收元素开始的通知。
characters();//接收元素中字符数据的通知。
例如:
创建
emps.xml到F盘根目录下
<?xml version="1.0" encoding="UTF-8"?>
<emps>
<emp id="1">
<name>zhangsan</name>
<sex>man</sex>
</emp>
<emp id="2">
<name>lisi</name>
<sex>women</sex>
</emp>
</emps>
解析类:
package
com.xml;
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.SAXException;
import
org.xml.sax.helpers.DefaultHandler;
public
class
ParseXML
extends
DefaultHandler {
//
获取栈实例
java.util.Stack
tags
=
new
java.util.Stack();
public
ParseXML() {
super
();
}
//
解析xml文件
public
void
getXML() {
SAXParserFactory factory = SAXParserFactory.newInstance();
try
{
SAXParser parser = factory.newSAXParser();
ParseXML parX =
new
ParseXML();
parser.parse(
"F:\emps.xml"
, parX);
}
catch
(Exception e) {
//
TODO
Auto-generated catch block
e.printStackTrace();
}
}
//
重写方法characters(...);
public
void
characters(
char
ch[],
int
start,
int
length)
throws
SAXException {
//
取出栈顶元素
String tag = (String)
tags
.peek();
//
比较栈顶元素
String text =
new
String(ch, start, length);
if
(tag.equals(
"emps"
)){
System.
out
.println(
"<emps>"
);
tags
.pop();
}
if
(tag.equals(
"name"
)) {
System.
out
.print(
" <name>"
+ text);
tags
.pop();
}
else
if
(tag.equals(
"sex"
)) {
System.
out
.print(
" <sex>"
+ text);
tags
.pop();
}
}
//
重写方法startElement(...);
public
void
startElement(String uri, String localName, String qName,
Attributes attrs) {
tags
.push(qName);
//
把项压入栈顶
// System.out.println(qName);
if
(qName.equals(
"emp"
)) {
String attName = attrs.getQName(0);
String attValue = attrs.getValue(0);
System.
out
.print(
" <"
+ qName +
" "
);
System.
out
.println(attName +
"=""
+ attValue +
"">"
);
}
}
//
重写方法endElement(...);
public
void
endElement(String uri, String localName, String qName)
throws
SAXException {
//
TODO
Auto-generated method stub
if
(qName.equals(
"emps"
)){
System.
out
.println(
"</emps>"
);
}
else
if
(qName.equals(
"emp"
)){
System.
out
.println(
" </emp>"
);
}
else
if
(qName.equals(
"name"
)){
System.
out
.println(
"</name>"
);
}
else
if
(qName.equals(
"sex"
)){
System.
out
.println(
"</sex>"
);
}
}
public
static
void
main(String[] args) {
new
ParseXML().getXML();
}
}
显示结果:
<emps>
<emp id="1">
<name>zhangsan</name>
<sex>man</sex>
</emp>
<emp id="2">
<name>lisi</name>
<sex>women</sex>
</emp>
</emps>
源码下载:http://file.javaxxz.com/2014/10/10/015742687.zip |
|