您的位置:首页 > 其它

XML文档解析几种方式

2015-12-26 16:23 417 查看

解析XML文档的三种方式:dom解析,sax解析,pull解析。

dom解析

概述:全称document object model(文档对象模型) 文档:指的是标记型文档(html、xml);对象:在对象里面有属性和方法;使用dom里面提供的对象里面的属性和方法,对标记型文档进行操作。dom解析常用于JavaWeb中的xml文档解析。

dom解析优缺点:

优点:根据xml文档的结构,在内存中分配了一个树形结构,因为是树形结构,很方便增加,修改,删除的操作。

缺点:如果解析的文档过大,一次性在内存中分配一个树形结构,容易造成内存溢出。

sax解析

概述:全称Simple API for XML,既是一种接口,也是一种软件包。它是一种XML解析的替代方法。SAX不同于DOM解析,它逐行扫描文档,一边扫描一边解析,当读到特定的标签时候,自动调用相应的方法进行操作。由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中,这对于大型文档的解析是个巨大优势。sax解析用于android中的xml文档解析。

sax解析优缺点:

优点:由于解析方式是边读边解析,不会造成内存的溢出。

缺点:不能实现增加,修改,删除的操作。

pull解析

概述:pull解析和sax解析的原理一样,pull解析xml文件把xml中的内容放到集合里面。不一样的是pullpull读取xml文件后调用方法返回的是数字:

读取到xml的声明返回数字0 START_DOCUMENT;

读取到xml的结束返回数字1 END_DOCUMENT

读取到xml的开始标签返回数字2 START_TAG

读取到xml的结束标签返回数字3 END_TAG

读取到xml的文本返回数字4 TEXT

pull解析常用于Android中的xml文件解析。也可脱离Android独自使用,由于我是搞Android开发的,这个就写的详细一点了。

代码:

person.xml

<?xml version="1.0" encoding="UTF-8"?>
<root>
<student id="1">
<name>张三</name>
<sex>男</sex>
<age>18</age>
</student>
<student id="2">
<name>李四</name>
<sex>女</sex>
<age>20</age>
</student>
</root>


PullPerson.java

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

public class PullPerson {

/**
* @author Listener_Gao
* @param args
*/
public static void main(String[] args) {
//person.xml文档在项目的src目录下
String path = "src/person.xml";
List<Person> list = null;
try {
list = pullParserXml(path);
} catch (Exception e) {
e.printStackTrace();
}

//遍历集合
for (Person p : list) {
System.out.println(p);
}

}
/**
* pull解析person.xml文件,把解析到的文件放到集合中
* @return List<Person> 返回list集合
* @param  filePath   xml文件的路径
*/
public static List<Person> pullParserXml(String filePath) throws Exception {

//创建解析器工厂 对象
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
//使用解析器工厂对象  创建解析器
XmlPullParser parser = factory.newPullParser();
//把要操作的文件放到解析器中
parser.setInput(new FileInputStream(filePath), "utf-8");

/***************************开始解析xml文档************************/
List<Person> list = null;
Person p = null;
//获取标签的类型
int typeEvent = 0; //parser.getEventType();
//如果没有读到结束的标签就一直循环
while((typeEvent = parser.getEventType()) != XmlPullParser.END_DOCUMENT) {
//得到当前解析到的标签的名称
String tagName = parser.getName();
/**
* 1,解析到root,创建list集合
* 2,解析到student,创建Person对象
* 3,解析到name,sex,age内容是,过去标签的内容
* 4,将标签的内容添加到person对象中
*/
switch(typeEvent) {
case XmlPullParser.START_TAG:
if("root".equals(tagName)) {
//解析到root,创建list集合
list = new ArrayList<>();
}else if("student".equals(tagName)) {
//解析到student,创建Person对象
p = new Person();
//读取student标签中的id属性
int id = Integer.parseInt(parser.getAttributeValue(0));
//将id的值放到person对象中
p.setId(id);
//简写成一步
//p.setId(Integer.parseInt(parser.getAttributeValue(0)));
}else if ("name".equals(tagName)) {
//得到标签的值
String name = parser.nextText();
//将得到的name的值放person对象中
p.setName(name);
}else if ("sex".equals(tagName)) {
p.setSex(parser.nextText());
}else if ("age".equals(tagName)) {
p.setAge(Integer.parseInt(parser.nextText()));
}
break;

case XmlPullParser.END_TAG:
//当解析到结束标签的root时,将对象添加到list集合中
if("student".equals(tagName)) {
list.add(p);
//p = null;
}
break;
}
//继续执行
parser.next();
}
return list;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: