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的更多相关文章

  1. XML的解析方式(DOM、SAX、StAX)

    (新)  XML的解析方式(DOM.SAX.StAX) 博客分类: XML   一般来说,解析XML文件存在着两种方式,一种是event-based API,比如说象SAX,XNI. 第二种是tree ...

  2. XML的解析(DOM以及SAX方式)

    感谢http://blog.csdn.net/redarmy_chen/article/details/12951649(关于SAX解析)以及http://blog.csdn.net/zhangerq ...

  3. XML文件解析-DOM4J方式和SAX方式

    最近遇到的工作内容都是和xml内容解析相关的. 1图片数据以base64编码的方式保存在xml的一个标签中,xml文件通过接口的方式发送给我,然后我去解析出图片数据,对图片进行进一步处理. 2.xml ...

  4. XML文件解析之DOM解析

    XML文件是一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.基本的解析方式包括DOM解析和SAX解析,具体来说包括DOM解析,SAX解析,DOM4J解 ...

  5. Android中三种常用解析XML的方式(DOM、SAX、PULL)简介及区别

    XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能.今天就由我向大家介绍一下在Android平台下几种常见的XML解 ...

  6. 八、Android学习第七天——XML文件解析方法(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:exten ...

  7. 9.XML文件解析

    一.XML简介 XML(EXtensible Markup Language),可扩展标记语言 特点:XML与操作系统.编程语言的开发平台无关 实现不同系统之间的数据交换 作用:数据交互 配置应用程序 ...

  8. Python实现XML文件解析

    1. XML简介 XML(eXtensible Markup Language)指可扩展标记语言,被设计用来传输和存储数据,已经日趋成为当前许多新生技术的核心,在不同的领域都有着不同的应用.它是web ...

  9. java基础之概谈xml文件解析

    XML已经成为一种非常通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便. 诸多web应用框架,其可配置的编程方式,给我们的开发带来了非常大程度的便捷,但细细 ...

随机推荐

  1. Java学习之国际化程序

    国际化程序就是把程序的语言根据用户使用的语言显示,各个国家的用户都可以看懂 实现方法就是把输出文字都写在配置文件里,然后根据用户系统语言选择不同的语言输出 package com.gh; import ...

  2. (收藏)KMP算法的前缀next数组最通俗的解释

    我们在一个母字符串中查找一个子字符串有很多方法.KMP是一种最常见的改进算法,它可以在匹配过程中失配的情况下,有效地多往后面跳几个字符,加快匹配速度. 当然我们可以看到这个算法针对的是子串有对称属性, ...

  3. iOS_第3方类库_BlurAlertView_GPUImage

    最终效果图: 先加入GPUImage.framework 导入BlurAlertView的类声明和类实现 // // BlurAlertView.h // 特效弹出框 // // Created by ...

  4. linux 工具: Top

    linux TOP命令各参数详解[转载] http://www.cnblogs.com/sbaicl/articles/2752068.html

  5. [POJ 2184]--Cow Exhibition(0-1背包变形)

    题目链接:http://poj.org/problem?id=2184 Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  6. 性能测试工具:AB

    ###################################################################################格式:ab -n 请求次数 -c ...

  7. poj1920 Towers of Hanoi

    关于汉诺塔的递归,记住一个结论是,转移n个盘子至少需要2^n-1步 #include<iostream> #include<cstdio> #include<cmath& ...

  8. freemarker序列的拆分

    freemarker序列的拆分 1.简易说明 序列的拆分能够是数组.字符串.布尔值等等 2.实现源代码 <#--freemarker序列的拆分--> ${"hudjfkskhd你 ...

  9. BZOJ 2789: [Poi2012]Letters( BIT )

    直接求逆序对就行了...时间复杂度O(nlogn) ------------------------------------------------------------------------- ...

  10. InputStream中read()与read(byte[] b)

    原文:InputStream中read()与read(byte[] b) read()与read(byte[] b)这两个方法在抽象类InputStream中前者是作为抽象方法存在的,后者不是,JDK ...