您的位置:首页 > 编程语言 > Java开发

Java解析xml——SAX解析

2016-05-27 13:58 465 查看

一、Dom解析 VS SAX解析

Dom解析是将整个xml文件加载到内存中,然后再进行相关的操作。

SAX解析是依次读取xml文件的内容,逐个解析。



二、SAX解析实例

books.xml:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id="1">
<name>冰与火之歌</name>
<author>乔治马丁</author>
<time>2014</time>
<price>89</price>
</book>
<book id="2">
<name>安徒生童话</name>
<price>40</price>
<time>2004</time>
<language>English</language>
</book>
</bookstore>


SaxDemo.java

public class SaxDemo {

public static void main(String[] args) {
//1、创建SAXParserFactory实例
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
//2、创建SAXParser实例
SAXParser parser = factory.newSAXParser();
//3、新建一个类SAXHandler继承DefaultHandler,重写其中的一些方法用来进行业务处理。
//再创建一个SAXHandler对象
SAXHandler handler = new SAXHandler();
//4、进行解析,传入SAXHandler对象作为解析xml的处理类
parser.parse("xml/books.xml", handler);

} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
SAXHandler.java

public class SAXHandler extends DefaultHandler {

int bookIndex = 0;

/**
* 开始解析xml文件
*/
@Override
public void startDocument() throws SAXException {
super.startDocument();

System.out.println("开始解析xml文件");
}

/**
* 解析xml文件结束
*/
@Override
public void endDocument() throws SAXException {
super.endDocument();

System.out.println("解析xml文件结束");
}

/**
* 开始解析xml元素
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);

//qName为标签名称
if("book".equals(qName)) {
bookIndex++;
System.out.println("======开始解析第" + bookIndex + "本书======");
//如果已知标签的属性,则可以直接调用Attributes.getValue(String name)获取属性值
System.out.println("已知book已有id属性,获取属性值-->" + attributes.getValue("id"));

//如果不知道标签的属性,则需要遍历Attributes分别获取属性名与属性值
int len = attributes.getLength();
System.out.println("book元素有" + len + "个属性");
for(int i = 0; i < len; i++) {
//通过Attributes.getQName(int index)获取属性名称
System.out.print("获取book属性" + attributes.getQName(i));
//通过Attributes.getValue(int index)获取属性值
System.out.println(",属性值-->" + attributes.getValue(i));
}
} else if(!"books".equals(qName) && !"bookstore".equals(qName)) {
System.out.print("解析到节点" + qName);
}
}

/**
* 解析xml元素结束
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);

if("book".equals(qName)) {
System.out.println("======解析第" + bookIndex + "本书结束======");
}
}

@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
//ch为整个xml文档的内容,start为当前标签内容所在位置,length为当前标签内容的长度
//需要过滤掉空格和换行,SAX解析也会把空格和换行当做xml文档的内容
String str = new String(ch, start, length);
if(!"".equals(str.trim())) {
System.out.println("-->节点值:" + str);
}
}

}


运行结果:

开始解析xml文件

======开始解析第1本书======

已知book已有id属性,获取属性值-->1

book元素有1个属性

获取book属性id,属性值-->1

解析到节点name-->节点值:冰与火之歌

解析到节点author-->节点值:乔治马丁

解析到节点time-->节点值:2014

解析到节点price-->节点值:89

======解析第1本书结束======

======开始解析第2本书======

已知book已有id属性,获取属性值-->2

book元素有1个属性

获取book属性id,属性值-->2

解析到节点name-->节点值:安徒生童话

解析到节点price-->节点值:40

解析到节点time-->节点值:2004

解析到节点language-->节点值:English

======解析第2本书结束======

解析xml文件结束

从运行结果可以看出SAX解析Handler处理顺序是:xml文件开头的startDocument-->所有节点startElement-->characters-->endElement-->文件末尾endDocument
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java xml