Android XML数据的三种解析方式

本篇文章包含以下内容:

XML数据的Dom解析
     XML数据的Sax解析
     XML数据的Pull解析
     Activity中使用三种解析
     Sax解析与Pull解析区别

三种解析方式的步骤:

1.在Assets文件夹中模拟创建XML数据
2.创建对应XML的Bean对象
3.开始解析

XML数据的Dom解析

DOM解析XML文件时,会将XML文件的所有内容读取到内存中(内存的消耗比较大),然后允许您使用DOM API遍历XML树、检索所需的数据

一、在Assets文件夹中模拟创建XML文件

<students>
 <student>
  <name sex="man">小明</name>
  <nickName>明明</nickName>
 </student>
 <student>
  <name sex="woman">小红</name>
  <nickName>红红</nickName>
 </student>
 <student>
  <name sex="man">小亮</name>
  <nickName>亮亮</nickName>
 </student>
</students>

二、创建对应XML的Bean对象

public class Student {
 private String name;
 private String sex;
 private String nickName;

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public String getSex() {
  return sex;
 }

 public void setSex(String sex) {
  this.sex = sex;
 }

 public String getNickName() {
  return nickName;
 }

 public void setNickName(String nickName) {
  this.nickName = nickName;
 }

 @Override
 public String toString() {
  return "Student{" +
    "name='" + name + '\'' +
    ", sex='" + sex + '\'' +
    ", nickName='" + nickName + '\'' +
    '}';
 }
}

三、Dom解析

public List<Student> dom2xml(InputStream is) throws Exception {
 //一系列的初始化
 List<Student> list = new ArrayList<>();
 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
 DocumentBuilder builder = factory.newDocumentBuilder();
 //获得Document对象
 Document document = builder.parse(is);
 //获得student的List
 NodeList studentList = document.getElementsByTagName("student");
 //遍历student标签
 for (int i = 0; i < studentList.getLength(); i++) {
  //获得student标签
  Node node_student = studentList.item(i);
  //获得student标签里面的标签
  NodeList childNodes = node_student.getChildNodes();
  //新建student对象
  Student student = new Student();
  //遍历student标签里面的标签
  for (int j = 0; j < childNodes.getLength(); j++) {
   //获得name和nickName标签
   Node childNode = childNodes.item(j);
   //判断是name还是nickName
   if ("name".equals(childNode.getNodeName())) {
    String name = childNode.getTextContent();
    student.setName(name);
    //获取name的属性
    NamedNodeMap nnm = childNode.getAttributes();
    //获取sex属性,由于只有一个属性,所以取0
    Node n = nnm.item(0);
    student.setSex(n.getTextContent());
   } else if ("nickName".equals(childNode.getNodeName())) {
    String nickName = childNode.getTextContent();
    student.setNickName(nickName);
   }
  }
  //加到List中
  list.add(student);
 }
 return list;
}

XML数据的Sax解析

SAX是一个解析速度快并且占用内存少的xml解析器,SAX解析XML文件采用的是事件驱动,它并不需要解析完整个文档,而是按内容顺序解析文档的过程

由于前面一和二的步骤是一样的,这里就省略了

三、Sax解析

public List<Student> sax2xml(InputStream is) throws Exception {
 SAXParserFactory spf = SAXParserFactory.newInstance();
 //初始化Sax解析器
 SAXParser sp = spf.newSAXParser();
 //新建解析处理器
 MyHandler handler = new MyHandler();
 //将解析交给处理器
 sp.parse(is, handler);
 //返回List
 return handler.getList();
}

public class MyHandler extends DefaultHandler {

 private List<Student> list;
 private Student student;
 //用于存储读取的临时变量
 private String tempString;

 /**
  * 解析到文档开始调用,一般做初始化操作
  *
  * @throws SAXException
  */
 @Override
 public void startDocument() throws SAXException {
  list = new ArrayList<>();
  super.startDocument();
 }

 /**
  * 解析到文档末尾调用,一般做回收操作
  *
  * @throws SAXException
  */
 @Override
 public void endDocument() throws SAXException {
  super.endDocument();
 }

 /**
  * 每读到一个元素就调用该方法
  *
  * @param uri
  * @param localName
  * @param qName
  * @param attributes
  * @throws SAXException
  */
 @Override
 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
  if ("student".equals(qName)) {
   //读到student标签
   student = new Student();
  } else if ("name".equals(qName)) {
   //获取name里面的属性
   String sex = attributes.getValue("sex");
   student.setSex(sex);
  }
  super.startElement(uri, localName, qName, attributes);
 }

 /**
  * 读到元素的结尾调用
  *
  * @param uri
  * @param localName
  * @param qName
  * @throws SAXException
  */
 @Override
 public void endElement(String uri, String localName, String qName) throws SAXException {
  if ("student".equals(qName)) {
   list.add(student);
  }
  if ("name".equals(qName)) {
   student.setName(tempString);
  } else if ("nickName".equals(qName)) {
   student.setNickName(qName);
  }
  super.endElement(uri, localName, qName);
 }

 /**
  * 读到属性内容调用
  *
  * @param ch
  * @param start
  * @param length
  * @throws SAXException
  */
 @Override
 public void characters(char[] ch, int start, int length) throws SAXException {
  tempString = new String(ch, start, length);
  super.characters(ch, start, length);
 }

 /**
  * 获取该List
  *
  * @return
  */
 public List<Student> getList() {
  return list;
 }
}

XML数据的Pull解析

Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,可以使用一个switch对感兴趣的事件进行处理

三、Pull解析

public List<Student> pull2xml(InputStream is) throws Exception {
 List<Student> list = null;
 Student student = null;
 //创建xmlPull解析器
 XmlPullParser parser = Xml.newPullParser();
 ///初始化xmlPull解析器
 parser.setInput(is, "utf-8");
 //读取文件的类型
 int type = parser.getEventType();
 //无限判断文件类型进行读取
 while (type != XmlPullParser.END_DOCUMENT) {
  switch (type) {
   //开始标签
   case XmlPullParser.START_TAG:
    if ("students".equals(parser.getName())) {
     list = new ArrayList<>();
    } else if ("student".equals(parser.getName())) {
     student = new Student();
    } else if ("name".equals(parser.getName())) {
     //获取sex属性
     String sex = parser.getAttributeValue(null,"sex");
     student.setSex(sex);
     //获取name值
     String name = parser.nextText();
     student.setName(name);
    } else if ("nickName".equals(parser.getName())) {
     //获取nickName值
     String nickName = parser.nextText();
     student.setNickName(nickName);
    }
    break;
   //结束标签
   case XmlPullParser.END_TAG:
    if ("student".equals(parser.getName())) {
     list.add(student);
    }
    break;
  }
  //继续往下读取标签类型
  type = parser.next();
 }
 return list;
}

Activity中使用三种解析

public class XmlActivity extends AppCompatActivity implements View.OnClickListener {

 private TextView tv;
 private Button bt_dom, bt_sax, bt_pull;
 private XmlUtils xmlUtils;
 private List<Student> students;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_xml);

  tv = (TextView) findViewById(R.id.tv);
  bt_dom = (Button) findViewById(R.id.bt_dom);
  bt_sax = (Button) findViewById(R.id.bt_sax);
  bt_pull = (Button) findViewById(R.id.bt_pull);

  bt_dom.setOnClickListener(this);
  bt_sax.setOnClickListener(this);
  bt_pull.setOnClickListener(this);

  xmlUtils = new XmlUtils();
 }

 @Override
 public void onClick(View v) {
  switch (v.getId()) {
   case R.id.bt_dom:
    try {
     students = xmlUtils.dom2xml(getResources().getAssets().open("student.xml"));
     tv.setText(students.toString());
    } catch (Exception e) {
     e.printStackTrace();
    }
    break;
   case R.id.bt_sax:
    try {
     students = xmlUtils.sax2xml(getResources().getAssets().open("student.xml"));
     tv.setText(students.toString());
    } catch (Exception e) {
     e.printStackTrace();
    }
    break;
   case R.id.bt_pull:
    try {
     students = xmlUtils.pull2xml(getResources().getAssets().open("student.xml"));
     tv.setText(students.toString());
    } catch (Exception e) {
     e.printStackTrace();
    }
    break;
  }
 }
}

三种解析方式的效果图是一样的

Sax解析与Pull解析区别

SAX和Pull的区别:SAX解析器的工作方式是自动将事件推入事件处理器进行处理,因此你不能控制事件的处理主动结束;而Pull解析器的工作方式为允许你的应用程序代码主动从解析器中获取事件,正因为是主动获取事件,因此可以在满足了需要的条件后不再获取事件,结束解析。

源码:http://xiazai.jb51.net/201611/yuanma/AndroidXmljiexi(jb51.net).rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android 解析XML 文件的四种方法总结

    java解析xml文件四种方式 1.介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的.DOM以及广义的基于树的处理具有几个优点.首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改.它还可以

  • Android中使用sax解析xml文件的方法

    SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备. SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML 语法中的某部分,如果符合就会触发事件.所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口.下面是一些ContentHandler接口常用的方法: startDocument():当遇到文档的开头的时候,调用

  • Android创建与解析XML(二)——详解Dom方式

    1. Dom概述 Dom方式创建XML,应用了标准xml构造器 javax.xml.parsers.DocumentBuilder 来创建 XML 文档,需要导入以下内容 javax.xml.parsers javax.xml.parsers.DocumentBuilder javax.xml.parsers.DocumentBuilderFactory javax.xml.parsers.ParserConfigurationException; javax.xml.transform jav

  • Android创建与解析XML(三)——详解Sax方式

    1. Sax概述 SAX是一种占用内存少且解析速度快的解析器,它采用的是事件启动,不需要解析完整个文档,而是按照内容顺序看文档某个部分是否符合xml语法,如果符合就触发相应的事件,所谓的事件就是些回调方法(callback),这些方法 定义在ContentHandler中,下面是其主要方法: startDocument():当遇到文档的时候就触发这个事件 调用这个方法 可以在其中做些预处理工作,如:申请对象资源 endDocument():当结束文档的时候就触发这个事件 调用这个方法 可以在其中

  • 基于Android XML解析与保存的实现

    解析XML文件:在Android平台上可以使用SAX.DOM和Android附带的pull解析器解析XML文件:pull解析器提供了各种事件,使用parser.next()方法进入下一个元素并触发相应事件,pull解析器产生的事件是一个数字,可以通过switch对感兴趣的事件进行处理:通过paser.nextText()方法可以获取下一个Text类型的节点的值:http://xmlpull.org/xmlpull-website/impls.shtml; 读取XMLXmlPullParser p

  • 详解Android之解析XML文件三种方式(DOM,PULL,SAX)

    1.xml文件代码 <?xml version="1.0" encoding="UTF-8" ?> <%@ page language="java" contentType="text/xml; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core

  • Android 创建与解析XML(四)——详解Pull方式

     1.Pull概述 Android系统中和创建XML相关的包为org.xmlpull.v1,在这个包中不仅提供了用于创建XML的 XmlSerializer,还提供了用来解析XML的Pull方式解析器 XmlPullParser XmlSerializer没有像XmlPullParser那样提取XML事件,而是把它们推出到数据流OutputStream或Writer中. XmlSerializer提供了很直观的API,即使用startDocument开始文档,endDocument结束文档,st

  • 详解android使用SAX解析XML文件

    解析XML的方式有很多种,大家比较熟悉的可能就是DOM解析. DOM(文件对象模型)解析:解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以根据DOM接口来操作这个树结构了. 优点:整个文档读入内存,方便操作:支持修改.删除和重现排列等多种功能. 缺点:将整个文档读入内存中,保留了过多的不需要的节点,浪费内存和空间. 使用场合:一旦读入文档,还需要多次对文档进行操作,并且在硬件资源充足的情况下(内存,CPU). 为了解决DOM解析存在的问题,就出现了SAX解析.其特点为: 优点:不

  • Android编程使用sax解析xml数据的方法详解

    本文实例讲述了Android编程使用sax解析xml数据的方法.分享给大家供大家参考,具体如下: 随着技术的发展,现在的web已经和以前不同了.web已经逐渐像移动的方向倾斜,作为程序员的确应该拓展一下自己的知识层面.学习各方面的知识,今天就接着前几天的弄一下Android的xml解析,这次就使用sax的方式解析xml.下面就一步一步的来做吧. 1. 编写一个简单的xml <?xml version="1.0" encoding="UTF-8"?> &l

  • Android编程解析XML方法详解(SAX,DOM与PULL)

    本文实例讲述了Android编程解析XML方法.分享给大家供大家参考,具体如下: XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能.今天就由我向大家介绍一下在Android平台下几种常见的XML解析和创建的方法. 在Android中,常见的XML解析器分别为SAX解析器.DOM解析器和PULL解析器,下面,我将一一向大家详细介绍. SAX解析器: SAX(Simple API for XML)解析器是一种基于事

  • Android解析XML的三种方式SAX、Pull、Dom

    在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX.Pull.Dom解析方式.最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull),本文对android解析xml的这三种方式进行一次总结. 今天解析的xml示例(channels.xml)如下: <?xml version="1.0" encoding="utf-8"?> <channel> <item id=&quo

  • Android 创建与解析XML(五)——详解Dom4j方式

    1.Dom4j概述 dom4j is an easy to use, open source library for working with XML, XPath and XSLT on the Java platform using the Java Collections Framework and with full support for DOM, SAX and JAXP. dom4j官方网址:dom4j dom4j源码下载:dom4j download 本示例中,需要导入dom4j

随机推荐