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; } }
相关文章推荐
- iOS初体验---通知
- android随笔09——中断电话
- Oracle APEX 5.0 新手教程(五) 登录控制
- 猜数字游戏
- java之冒泡排序与选择排序
- Model的合理使用时机
- Python Argparse 简易指南
- 【VirtualBox】虚拟硬盘格式vdi和vmdk相互转换方法
- Java过滤器与SpringMVC拦截器之间的关系与区别
- Oracle APEX 5.0 新手教程(四) 页面动态生成
- IOS UICollectionView 横向分页加载(左滑加载数据)
- vs2010 files 的值乱码
- 剑指Offer:树的子结构(JAVA)
- 147,函数
- Java或Android中计算某点是否在多边形中
- 期末总结
- Xcode 查看运行时ViewController结构
- 判断ios app 第一次启动
- Redis Sentinel基本介绍(翻译以及总结)
- 在Mac中像Windows一样查看Tomcat控制台信息