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. 九度OJ 1043:Day of Week(星期几) (日期计算)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5349 解决:1923 题目描述: We now use the Gregorian style of dating in Russia. ...

  2. zookeeper_action

    连接串 从节点列表本地缓存主节点对未分配的任务,随机分配给从节点(不合理??)从节点保存一个本地待执行任务列表单独的线程对节点已分配任务进行循环 进程p为了获锁——>创建节点znode_/loc ...

  3. [异步][jms][activeMq]怎样做到重试机制不会导致一条消息被多次运行.

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/fei33423/article/details/32723571 淘宝海量存储之单机事务面临的问题及 ...

  4. git 从远端拉取指定分支和推送本地某个分支到远端

    如题,可以直接从远端拉取某个分支,也可以直接将本地某个分支推送到远端. 原文链接:https://www.cnblogs.com/hamsterPP/p/6810831.html

  5. Java for LeetCode 085 Maximal Rectangle

    Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and ...

  6. python之virtualenv 与 virtualenvwrapper 详解

    在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题: 亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难. 此时,我们需要对于不同的工程使用 ...

  7. Machine Learning No.9: Dimensionality reduction

    1. Principal component analysis algorithm data preprocessing 2. choosing the number of principal com ...

  8. image auto fix the View

    image: { flex: 1, width: null, height: null, resizeMode: 'contain' }

  9. ORA-00600: internal error code, arguments: [6749], [3], [12602196]

    环境信息:Linux5.8 oracle10.2.0.4 问题现象: 现象1:alert日志有大量下面的错误信息: Wed Aug 27 21:01:27 2014Errors in file /u0 ...

  10. Custom Database Integration Guide

    Introduction This document provides instructions for integrating Openfire authentication, users, and ...