1、Sax解析(simple api  for xml)

  使用流式处理的方式,它并不记录所读内容的相关信息。它是一种以事件为驱动的XML API,解析速度快,占用内存少。使用回调函数来实现。

     class MyDefaultHander extends  DefaultHandler{
private List<Student> list;
private Student student; @Override
public void startDocument() throws SAXException {
super.startDocument();
list=new ArrayList<>();
} @Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if(qName.equals("student")){
student=new Student(); }
preTag=qName;
} @Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if(qName.equals("student")){
list.add(student);
}
preTag=null;
} @Override
public void characters(char[] ch, int start, int length) throws SAXException {
if(preTag!=null){
if(preTag.equals("id")){
student.setId(Integer.parseInt(new String(ch,start,length)));
}else if(preTag.equals("name")){
student.setName(new String(ch,start,length));
}else if(preTag.equals("age")){
student.setAge(Integer.parseInt(new String(ch,start,length)));
}
}
}
public List<Student> getStudents(){
return list;
}
}
public List<Student> sax_parser(){
List<Student> list=null;
try {
SAXParser parser= SAXParserFactory.newInstance().newSAXParser();
InputStream is= getAssets().open("student.xml");
MyDefaultHander hander=new MyDefaultHander();
parser.parse(is,hander);
list= hander.getStudents();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}

2、Dom解析

  DOM(Document Object Model) 是一种用于XML文档的对象模型,可用于直接访问XML文档的各个部分。它是一次性全部将内容加载在内存中,生成一个树状结构,它没有涉及回调和复杂的状态管理。 缺点是加载大文档时效率低下

     public  List<Student> DOM_parser(){
DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance();
List<Student> list=null;
try {
Document dom= factory.newDocumentBuilder().parse(getAssets().open("student.xml"));
Element element= dom.getDocumentElement();
NodeList nodeList= element.getChildNodes();
list=new ArrayList<>();
for(int i=0;i<nodeList.getLength();i++){
Log.i(TAG, "DOM_parser: "+nodeList.item(i).getNodeName());
if(nodeList.item(i).getNodeName().equals("student")){
NodeList childList= nodeList.item(i).getChildNodes();
Student stu=new Student();
for(int k=0;k<childList.getLength();k++){
if(childList.item(k).getNodeName().equals("id")){
stu.setId(Integer.parseInt(childList.item(k).getFirstChild().getNodeValue()));//注意直接getNodeValue()永远返回null,需调用getFirsetChild()后调用getNodeValue()
}else if(childList.item(k).getNodeName().equals("name")){
stu.setName(childList.item(k).getFirstChild().getNodeValue());
}else if(childList.item(k).getNodeName().equals("age")){
stu.setAge(Integer.parseInt(childList.item(k).getFirstChild().getNodeValue()));
}
}
list.add(stu);
}
}
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
return list;
}

3、pull解析(android 推荐)

  Pull内置于Android系统中。也是官方解析布局文件所使用的方式。Pull与SAX有点类似,都提供了类似的事件,如开始元素和结束元素。不同的是,SAX的事件驱动是回调相应方法,需要提供回调的方法,而后在SAX内部自动调用相应的方法。而Pull解析器并没有强制要求提供触发的方法。因为他触发的事件不是一个方法,而是一个数字。它使用方便,效率高

     public  List<Student> Xml_pull_parser(){
List<Student> list=null;
XmlPullParser parser= Xml.newPullParser();
try {
parser.setInput(getAssets().open("student.xml"),"UTF-8");
int event_code= parser.getEventType();
Student student=null;
while (event_code!=XmlPullParser.END_DOCUMENT){
switch (event_code){
case XmlPullParser.START_DOCUMENT:
list=new ArrayList<>();
break;
case XmlPullParser.START_TAG:
if(parser.getName().equals("student")){
student=new Student();
}
if(student!=null){
if(parser.getName().equals("id")){
// Log.i(TAG, "Xml_pull_parser: id="+parser.getText());
student.setId( Integer.parseInt(parser.nextText()));
}else if(parser.getName().equals("name")){
student.setName(parser.nextText());
}else if(parser.getName().equals("age")){
student.setAge(Integer.parseInt(parser.nextText()));
}
}
break;
case XmlPullParser.END_TAG:
if(parser.getName().equals("student")){
list.add(student);
student=null;
}
break;
}
event_code= parser.next(); }
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}

解析Xml文件的三种方式的更多相关文章

  1. 解析Xml文件的三种方式及其特点

    解析Xml文件的三种方式 1.Sax解析(simple api  for xml) 使用流式处理的方式,它并不记录所读内容的相关信息.它是一种以事件为驱动的XML API,解析速度快,占用内存少.使用 ...

  2. 解析xml文件的四种方式

    什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没 ...

  3. Android-----解析xml文件的三种方式

    SAX解析方法介绍: SAX(Simple API for XML)是一个解析速度快并且占用内存少的XML解析器,非常适合用于Android等移动设备.SAX解析XML文件采用的是事件驱动,也就是说, ...

  4. 解析XML文件的几种方式及其比较

    解析xml文件目前比较流行的主要有四种方式: 1. DOM(Document Object Model)它把整个XML文档当成一个对象加载到内  存,不管文档有多大.它一般处理小文件 2.SAX(Si ...

  5. android中解析文件的三种方式

    android中解析文件的三种方式     好久没有动手写点东西了,最近在研究android的相关技术,现在就android中解析文件的三种方式做以下总结.其主要有:SAX(Simple API fo ...

  6. 解析XML文件的几种常见操作方法—DOM/SAX/DOM4j

    解析XML文件的几种常见操作方法—DOM/SAX/DOM4j 一直想学点什么东西,有些浮躁,努力使自己静下心来看点东西,哪怕是回顾一下知识.看到了xml解析,目前我还没用到过.但多了解一下,加深点记忆 ...

  7. java读取XML文件的四种方式

    java读取XML文件的四种方式 Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT& ...

  8. Velocity中加载vm文件的三种方式

    Velocity中加载vm文件的三种方式: a.  加载classpath目录下的vm文件 /** * 初始化Velocity引擎 * --VelocityEngine是单例模式,线程安全 * @th ...

  9. 前端js,css文件合并三种方式,bat命令

    前端js,css文件合并三种方式,bat命令 前端js文件该如何合并三个方式如下:1. 一个大文件,所有js合并成一个大文件,所有页面都引用它.2. 各个页面大文件,各自页面合并生成自己所需js的大文 ...

随机推荐

  1. Grunt学习笔记【3】---- filter使用方式和实现原理详解

    本文主要讲配置任务中的filter,包括使用默认fs.Stats方法名和自定义过滤函数,以及filter的实现原理. 通过设置filter属性可以实现一些特殊处理逻辑.例如:要清理某个文件夹下的所有空 ...

  2. Versions 崩溃(Mac升级OS X Yonsemite 10.10)

    今天兴冲冲的升级到了OS X Yonsemite 10.10,结果发现SVN工具不能用了,于是找到一个暂时的解决的方法 1.打开目录~/.subversion/servers 2.在[global] ...

  3. 查找SAP 系统Parameter ID 4种方法

    转自 http://blog.csdn.net/jy00873757/article/details/8517426 ***程序RPR_ABAP_SOURCE_SCAN  一.用F1,直接可以看到这个 ...

  4. Cortex-M3 Bit-Banding

    Cortex-M3 Bit-Banding 1. 概述 CM3的存储器系统支持所谓的"位带"(bit-band)操作. 通过它,实现了对单一bit的原子操作.位带操作仅适用于一些特 ...

  5. react-native 支持 gif 图片

    只需要在android/app/build.gradle中的dependencies字段中添加: compile 'com.facebook.fresco:animated-gif:0.13.0' 然 ...

  6. Javascript类型转换的规则实例解析

    http://www.jb51.net/article/79916.htm 类型转换可以分为隐式转换和显式转换,所谓隐式转换即程序在运行时进行的自动转换,显式转换则是人为的对类型进行强制转换.Java ...

  7. JAVA-三大语句(选择语句、条件语句、循环语句)

    跳出指定的for循环体,和goto很像 1 K:for(int i=0;i<3;i++){//给这个for循环体取一个名字为K 2 for(int j=0;j<3;j++){ 3 if(j ...

  8. iOS开发 - 如何跳到系统设置里的各种设置界面

    在iOS开发中,有时会有跳转系统设置界面的需求,例如提示用户打开蓝牙或者WIFI,提醒用户打开推送或者位置权限等.在iOS6之后,第三方应用需要跳转系统设置界面,需要在URL type中添加一个pre ...

  9. CI公用模型

    <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); /** * SEO管理系统 -- 公用模型 ...

  10. struts2的结果类型

    1.从struts-default.xml入手,得到结果类型列表以及对应的处理类: <result-types> <!-- 转发到action --> <result-t ...