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;@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {// TODO Auto-generated method stubif("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);}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {// TODO Auto-generated method stubif(qName.equals("book")){list.add(book);book = null;}currentTag = null;super.endElement(uri, localName, qName);}@Overridepublic 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中默认相同的编码,输出时选用字节流,配合格式化输出器中规定的编码,这样就不会产生中文乱码问题了。

转载于:https://www.cnblogs.com/yfsmooth/p/4544818.html

XML文件解析之--DOM与SAX相关推荐

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

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

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

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

  3. XML解析之DOM、SAX、JAXP、DOM4J

    XML解析之DOM.SAX.JAXP.DOM4J 1. DOM与SAX XML是 一种通用的数据交换格式,可以使数据在各种应用程序之间轻松地实现数据交换. 虽然XML有各种各样的优点,但对于XML的解 ...

  4. java dom xml 换行,dom4j解析xml文件_用DOM解析XML文件,怎么才能让解析出来的文本不用换行_dom解析xml文件...

    网友求助:dom4j解析xml文件_用DOM解析XML文件,怎么才能让解析出来的文本不用换行_dom解析xml文件 问题importjava.text.SimpleDateFormat; import ...

  5. python之XML文件解析

    python对XML的解析 常见的XML编程接口有DOM和SAX,这两种接口处理XML文件的方式不同,当然使用场合也不同. python有三种方法解析XML,分别是SAX,DOM,以及ElementT ...

  6. Android开发历程_18(XML文件解析)

    前言  本文主要介绍在Android中怎样来解析XML文件.主要采用的是SAX机制,SAX全称为Simple API for XML,它既是一种接口,也是一个软件包.作为接口,SAX是事件驱动型XML ...

  7. java怎么xml文件解析_Java对Xml文件解析

    JAVA 解析 XML 通常有两种方式,DOM 和 SAX. DOM 虽然是 W3C 的标准,提供了标准的解析方式,但它的解析效率一直不尽如人意,因为使用DOM解析XML时,解析器读入整个文档并构建一 ...

  8. 【VOC格式xml文件解析】——Python

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/4/26 12:49 # @Author : @linlianqin # @S ...

  9. dom4j工具类_基于DOM4J的XML文件解析类

    XML文件解析分四类方式:DOM解析:SAX解析:JDOM解析:DOM4J解析.其中前两种属于基础方法,是官方提供的平台无关的解析方式:后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于ja ...

最新文章

  1. nginx基于域名的日志切割脚本
  2. Firefox Portable Developer 52.0.0.6176-6178
  3. python面向什么编程_python基础-面向过程编程
  4. linux操作系统版本 3100,Linux操作系统默认打开文件数
  5. Windows xp 如何查看SID?
  6. P2084 进制转换
  7. 【肥朝】看源码,我为什么推荐IDEA?
  8. Python 中@符号解释
  9. MongoDB 事务,复制和分片的关系
  10. 吊打 IE、Firefox,谷歌 Chrome 十年封神记
  11. Movavi Photo Editor零失败更改图片背景教程
  12. HTML简洁自适应个人码农主页源码
  13. 主成分分析和因子分析的理论与速成应用丨R语言和SPSS比较案例
  14. K-means之亚洲杯
  15. 做html5抽奖程序xu,用jQuery实现抽奖程序
  16. 关于栈迁移的那些事儿
  17. Q1营收超预期但仍呈负增长,携程究竟在哪里“丢了分”?
  18. 计算机键盘分区,电脑初学者必看键盘五个分区功能知识.doc
  19. pointcut表达式
  20. 分布式链路追踪深入了解

热门文章

  1. MFC关闭对话框可以不析构吗_Win10关闭Defender和防火墙
  2. laravel生成php代码,laravel代码生成器
  3. spring security oauth2_SpringBoot2 整合OAuth2实现统一认证
  4. Android微信怎么变成黑色,科技知识:安卓微信怎么变成黑色主题 安卓微信变成黑色主题方法...
  5. linux securefx 传输文件失败,解惑:如何使用SecureCRT上传和下载文件、SecureFX乱码问题...
  6. mysql快捷键设置_MySQL快捷命令
  7. pythonurllib的使用_python re和urllib的使用问题。
  8. java print int_java – 在printin输入int
  9. 选择虚拟主机服务器,选择虚拟主机服务器
  10. 语言怎么表示词谱_跨语言词表示方法(一)