XML文件解析之--DOM与SAX
xml文件又称‘可扩展性标记语言’,可以对文档和数据进行结构化处理,从而能够在部门、客户和供应商之间进行交换,实现动态内容生成,企业集成和应用开发。
我们在进行web开发的时候离不开xml文件,xml文件无处不在,这次就烂讨论一下xml常用的解析方法及其CRUD操作,欢迎大家交流指正。
我们先来看看两种解析方式的过程,比较一下他们的优劣之处。
SAX解析方式:它对xml文档进行逐行扫描,一边扫描一边解析。当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。
DOM解析方式:DOM解析是W3C组织提供的标准,把所有内容一次性的装载入内存,并构建一个驻留在内存中的树状结构,然后根据节点之间的关系来解析XML。
性能分析:
1.SAX解析因为是逐行逐句扫描解析,比起DOM方式一次性装在所有内容到内存中来说,效率来说应该更高一些。
2.但是恰恰是SAX这种解析方式,注定使SAX解析不适合对XML文档进行增删改等操作。而DOM解析的增删改操作相比之下就十分方便。
3.因为DOM解析式一次性装在所有内容到内存中,所以如果用户只需要其中一部分内容,DOM解析的方式的效率就大打折扣。
综上分析:sax解析更适合做部分信息的读取操作,DOM解析更适合做XML文件的增删改操作。
接下来我们来看看它们的CRUD操作
xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books SYSTEM "theBook.dtd">
<books>
<book>
<id>01</id>
<name>鲁滨逊漂流记</name>
<price>33</price>
</book>
<book>
<id>02</id>
<name>钢铁是怎样炼成的</name>
<price>30</price>
</book>
</books>
对应的Bean类
public class Book {
private String id;
private String name;
private String price;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
}
1.SAX解析:
流程:
1.获取工厂实例;
2.得到解析器;
3.得到读取器;
4.设置内容处理器;(SAX解析方式给我们提供了不同的处理器接口以及父类,我们可以选择继承其中的父类或者实现接口进行内容处理)
在进行内容处理时,SAX提供了多种不同的方法,分别在文档的开始和结尾,元素的开始和结尾等有事件,我们需要在相应的地方重写这些事件完成功能。
5.最后我们将相应的对象模型设置属性,将其存入list中,返回list。
解析实例:
public void saxFactory() throws ParserConfigurationException, SAXException, IOException{
//获得工厂实例
SAXParserFactory ft = SAXParserFactory.newInstance();
//得到解析器
SAXParser sp = ft.newSAXParser();
//得到读取器
XMLReader reader = sp.getXMLReader();
//设置内容处理器
BeanListHandler handler = new BeanListHandler();
reader.setContentHandler(handler);
reader.parse("src/Book.xml");
List <Book> list = handler.getList();
}
BeanListHandler类
class BeanListHandler extends DefaultHandler{
private List list = new ArrayList();
private String currentTag;
private Book book;
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
if("name".equals(currentTag)){
String name = new String(ch,start,length);
book.setName(name);
}
if("id".equals(currentTag)){
String id = new String(ch,start,length);
book.setId(id);
}
if("price".equals(currentTag)){
String price = new String(ch,start,length);
book.setPrice(price);
}
super.characters(ch, start, length);
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
if(qName.equals("book")){
list.add(book);
book = null;
}
currentTag = null;
super.endElement(uri, localName, qName);
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
currentTag = qName;
if("book".equals(currentTag)){
book = new Book();
}
super.startElement(uri, localName, qName, attributes);
}
public List getList() {
return list;
}
}
SAX解析:相对使用起来复杂一些,主要是实现步骤顺序,以及相对应事件中填入实现功能代码。
2.DOM解析:
DOM解析的实现代码相对于前者就简单易懂些
DOM解析中有多种解析工具,此处以DOM4j为例
主要步骤:
1.获得读取器
2.获得document对象
3.对相应的节点对象进行操作
读取操作(获取某个节点的值):
public void read() throws DocumentException{
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/Book.xml"));
Element root = document.getRootElement();
Element book = (Element)root.elements("book").get(1);
System.out.println(book.element("name").getText());
}
增加操作:
public void add() throws DocumentException, IOException{
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/Book.xml"));
Element book = document.getRootElement().element("book");
book.addElement("author").setText("abc");
//格式化输出器
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(new FileOutputStream("src/Book.xml"),format);
writer.write(document);
writer.close();
}
删除操作:
public void delete() throws DocumentException, IOException{
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/Book.xml"));
Element root = document.getRootElement();
Element name = root.element("book").element("name");
name.getParent().remove(name);
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(new FileOutputStream("src/Book.xml"),format);
writer.write(document);
writer.close();
}
修改操作:
public void update() throws DocumentException, IOException{
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/Book.xml"));
Element root = document.getRootElement();
Element book = (Element) root.elements("book").get(1);
book.element("name").setText("西游记");
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(new FileOutputStream("src/Book.xml"),format);
writer.write(document);
writer.close();
}
!!此处需要注意:也许大家注意到了增删改后面有五行代码是一样的。没错!因为需要对xml文件进行读写,所以也需要解决乱码问题,解决乱码问题有多种方法,此处只列举这一种方法,创建格式化输出器,规定其编码和xml中默认相同的编码,输出时选用字节流,配合格式化输出器中规定的编码,这样就不会产生中文乱码问题了。
XML文件解析之--DOM与SAX的更多相关文章
- XML的解析方式(DOM、SAX、StAX)
(新) XML的解析方式(DOM.SAX.StAX) 博客分类: XML 一般来说,解析XML文件存在着两种方式,一种是event-based API,比如说象SAX,XNI. 第二种是tree ...
- XML的解析(DOM以及SAX方式)
感谢http://blog.csdn.net/redarmy_chen/article/details/12951649(关于SAX解析)以及http://blog.csdn.net/zhangerq ...
- XML文件解析-DOM4J方式和SAX方式
最近遇到的工作内容都是和xml内容解析相关的. 1图片数据以base64编码的方式保存在xml的一个标签中,xml文件通过接口的方式发送给我,然后我去解析出图片数据,对图片进行进一步处理. 2.xml ...
- XML文件解析之DOM解析
XML文件是一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.基本的解析方式包括DOM解析和SAX解析,具体来说包括DOM解析,SAX解析,DOM4J解 ...
- Android中三种常用解析XML的方式(DOM、SAX、PULL)简介及区别
XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能.今天就由我向大家介绍一下在Android平台下几种常见的XML解 ...
- 八、Android学习第七天——XML文件解析方法(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:exten ...
- 9.XML文件解析
一.XML简介 XML(EXtensible Markup Language),可扩展标记语言 特点:XML与操作系统.编程语言的开发平台无关 实现不同系统之间的数据交换 作用:数据交互 配置应用程序 ...
- Python实现XML文件解析
1. XML简介 XML(eXtensible Markup Language)指可扩展标记语言,被设计用来传输和存储数据,已经日趋成为当前许多新生技术的核心,在不同的领域都有着不同的应用.它是web ...
- java基础之概谈xml文件解析
XML已经成为一种非常通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便. 诸多web应用框架,其可配置的编程方式,给我们的开发带来了非常大程度的便捷,但细细 ...
随机推荐
- linux进程解析--进程切换
为了控制进程的执行,linux内核必须有能力挂起正在cpu上运行的进程,换入想要切换的进程,也就是恢复以前某个挂起的进程,这就是linux的进程切换. 1进程切换的时机 一般来说,进程切换都是发生在 ...
- C语言中操作符的优先级大全
C语言中操作符的优先级大全, 当然c++, Objective-C,大部分语言都试用. 下面是来自The C Programming Language 2th的总结. OperatorsAssocia ...
- ThinkPHP - 配置项目结构
配置项目结构: 项目如果分为前后台使用. 那么最关键的就是,使用公共部分文件的划分,其中最为核心的就是公共配置文件的使用. 下面介绍的就是怎么将前后台项目的公共部分提起出来. 首先是其他公共的文件夹: ...
- 【Eclipse Plugin】SonarQube 启动报错
由于近期,信息安全部在搞代码优化工作.所以,配合上边的工作需求,使用sonar对代码进行优化检测.在Eclipse上装Sonar很简单,只要在Eclipse Marketplace上面搜索“Sonar ...
- 字符设备驱动: register_chrdev和register_chrdev_region
概述: register_chrdev与unregister_chrdev配对使用: /*register_chrdev = __register_chrdev_region (一次性256个子设备, ...
- 机器学习笔记(三)- from Andrew Ng的教学视频
week four: Non-linear hypotheses:Neural Networks -->x1 and x2 x1 XNOR x2 ->a1->x1 and x2;a2 ...
- set--常见成员函数及基本用法
c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器. set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. ...
- javascript:void(0)的作用示例
在做页面时,如果想做一个链接点击后不做任何事情,或者响应点击而完成其他事情,可以设置其属性 href = "#",但是,这样会有一个问题,就是当页面有滚动条时,点击后会返回到页面顶 ...
- ZOJ2849 优先队列BFS
Attack of Panda Virus Time Limit: 3 Seconds Memory Limit: 32768 KB In recent months, a computer ...
- 同步机制Lock初学(转)
前段时间review同事的代码,发现可以简化成如下的模型: Thread 1 Thread 2 lock.lock(); condition.await(); lock.unlock() lock.l ...