Android中对xml文件解析的3种方式总结

 更新时间:2018年02月25日 11:11:04   作者:uniapp  
这篇文章主要给大家介绍了关于Android中对xml文件解析的3种方式,分别是 Dom 、 SAX 和 dom4j,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。

前言

xml 是数据传输的一种格式,Android 中的布局文件、设置文件等都采用它来表示。Android 中对 xml 文件的解析也有多种方式,下面介绍常用的 3 种方式: Dom 、 SAX 和 dom4j。下面话不多说了,来一起看看详细的介绍吧。

先看一个简单的 xml 文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <书 出版社="骏马">
 <书名>如何成功</书名>
 <作者>uniapp</作者>
 <售价>666</售价>
 </书>
 <书>
 <书名>如何成功1</书名>
 <作者>uniapp</作者>
 <售价>1991</售价>
 </书>
</书架>

1、Dom解析方式

Dom 解析通过 Document 类将整个 xml 文件一次读入内存,然后通过操作 Document 实例的属性实现对 xml 文件中元素的增删改查,具体代码如下:

2 SAX解析

SAX 对 xml 文件采用边读边解析的方式,就像我们用眼睛读文章一样,一行一行的进行。相比 Dom 方式产生的瞬时内存峰值,SAX 对内存的消耗比较平稳。它通过解析类提供对外接口,具体实现:

public class SaxDemo {
 @Test
 public void main() throws ParserConfigurationException, SAXException, IOException{
 //工厂类实例
 SAXParserFactory fac = SAXParserFactory.newInstance();
 //创建解析器
 SAXParser parser = fac.newSAXParser();
 //解析文档
 XMLReader reader = parser.getXMLReader();
 reader.setContentHandler(new MyDefultHandle());
 reader.parse("./app/src/main/java/test/DTD.xml");

 }
}

class MyDefultHandle extends DefaultHandler{

 @Override
 public void startDocument() throws SAXException {
 super.startDocument();

 System.out.println("文档开始");
 }

 @Override
 public void endDocument() throws SAXException {
 super.endDocument();
 System.out.println("文档结束");
 }

 private boolean isPrice = false;
 @Override
 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
 super.startElement(uri, localName, qName, attributes);
 System.out.println("元素开始: " + qName);

 }

 @Override
 public void endElement(String uri, String localName, String qName) throws SAXException {
 super.endElement(uri, localName, qName);

 if ("售价".equals(qName)){
  isPrice = false;
 }
 System.out.println("元素结束: " + qName);

 }

 @Override
 public void characters(char[] ch, int start, int length) throws SAXException {
 super.characters(ch, start, length);
 if (isPrice){
  System.out.println("内容: " + new String(ch, start, length));
 }
 }
}

3 Dom4j 解析

Dom4j 解析是第三开源库给出的解析方式,结合了 Dom 和 SAX 双方的优点,对 xml 文件逐步读入内存,并且可以采用面向对象的方式访问节点。代码如下:

/**
 * 读取属性值
 * */
 public void readAttr() throws DocumentException {
 Document doc = getDocument();
 List<Element> list = doc.getRootElement().elements("书");
 for (int i = 0; i < list.size(); i++) {
  Element el = (Element) list.get(i);
  Attribute att = el.attribute("出版社");
  System.out.print("结果: " + att.getName() + att.getValue());
 }
 }

 /**
 * 读取节点
 * */
 public void read() throws DocumentException {
 /**
  * 不能越级获取值
  * */
 Document doc = getDocument();
 org.dom4j.Element el = doc.getRootElement();
 Element firstEl = el.element("书");
 Element firstBookEl = firstEl.element("书名");

 String name = firstBookEl.getText();
 System.out.println("书名: " + name);
 }

 public void update() throws DocumentException, IOException {
 Document doc = getDocument();
 List<Element> list = doc.getRootElement().elements("书");
 Element element = list.get(0);
 Element priceEl = element.element("售价");
 priceEl.setText("888元");
 XMLWriter writer = new XMLWriter(new FileOutputStream("./app/src/main/java/test/Dom4j3.xml"));
 writer.write(doc);
 }

 /**
 * 删除节点
 * */
 public void deletePrice() throws Exception{
 SAXReader reader = new SAXReader();
 Document doc = reader.read("./app/src/main/java/test/Dom4j1.xml");
 Element el = (Element) doc.getRootElement().elements("书").get(1);
 Element elPrice = (Element) el.elements("售价").get(1);
 elPrice.getParent().remove(elPrice);
 XMLWriter writer = new XMLWriter(new FileOutputStream("./app/src/main/java/test/Dom4j2.xml"));
 writer.write(doc);
 writer.close();
 }
 /**
 * 增加节点
 * */
 public void addEl() throws DocumentException, IOException {
 Document doc = getDocument();
 Element el = (Element) doc.getRootElement().elements("书").get(1);
 el.addElement("售价").setText("6.66元");
 XMLWriter writer = new XMLWriter(new FileOutputStream("./app/src/main/java/test/Dom4j1.xml"));
 writer.write(doc);
 writer.close();
 }

 private Document getDocument() throws DocumentException {
 SAXReader reader = new SAXReader();
 return reader.read("./app/src/main/java/test/DTD.xml");
 }

结合以上三种解析方式的特点,我们可以得出结论:如果 xml 文件很小,可以选择面向对象的 Dom 或者 dom4j 方式;反之可以选择 SAX 方式,一面实际内存不足造成闪退。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • Android studio 生成带Kotlin文档的实现方式

    Android studio 生成带Kotlin文档的实现方式

    这篇文章主要介绍了Android studio 生成带Kotlin文档的实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Android 实现电话来去自动录音的功能

    Android 实现电话来去自动录音的功能

    本文主要介绍Android 电话自动录音功能的开发,这里提供实现代码和实现效果图,有需要的小伙伴可以参考下
    2016-08-08
  • Android中Bitmap用法实例分析

    Android中Bitmap用法实例分析

    这篇文章主要介绍了Android中Bitmap用法,结合实例形式分析了Android操作图片的载入、属性设置、旋转等相关技巧,需要的朋友可以参考下
    2016-02-02
  • Android仿QQ左滑删除置顶ListView操作

    Android仿QQ左滑删除置顶ListView操作

    这篇文章主要为大家详细介绍了Android仿QQ左滑删除置顶ListView操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • 详解android 通过uri获取bitmap图片并压缩

    详解android 通过uri获取bitmap图片并压缩

    这篇文章主要介绍了详解android 通过uri获取bitmap图片并压缩的相关资料,希望通过本文能帮助到大家,让大家理解这部分内容,需要的朋友可以参考下
    2017-10-10
  • Android startService的使用与Service生命周期案例详解

    Android startService的使用与Service生命周期案例详解

    这篇文章主要介绍了Android startService的使用与Service生命周期案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • 解决Eclipse创建android项目无法正常预览布局文件问题的方法

    解决Eclipse创建android项目无法正常预览布局文件问题的方法

    这篇文章主要介绍了解决Eclipse创建android项目无法正常预览布局文件问题的方法,需要的朋友可以参考下
    2015-12-12
  • Android入门之SubMenu的实现详解

    Android入门之SubMenu的实现详解

    这篇文章主要为大家详细介绍了Android如何实现SubMenu子菜单的效果,文中的示例代码讲解详细,对我们学习Android有一定的帮助,感兴趣的可以了解一下
    2022-11-11
  • Android使用ListView实现滚轮的动画效果实例

    Android使用ListView实现滚轮的动画效果实例

    这篇文章主要介绍了Android使用ListView实现滚轮的动画效果实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Android Handler机制详解原理

    Android Handler机制详解原理

    Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分在消息队列中逐一将消息取出,然后对消息进行处理,也就是发送消息和接收消息不是同步的处理。 这种机制通常用来处理相对耗时比较长的操作
    2021-11-11

最新评论