解析Xml文件的三种方式
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文件的三种方式的更多相关文章
- 解析Xml文件的三种方式及其特点
解析Xml文件的三种方式 1.Sax解析(simple api for xml) 使用流式处理的方式,它并不记录所读内容的相关信息.它是一种以事件为驱动的XML API,解析速度快,占用内存少.使用 ...
- 解析xml文件的四种方式
什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没 ...
- Android-----解析xml文件的三种方式
SAX解析方法介绍: SAX(Simple API for XML)是一个解析速度快并且占用内存少的XML解析器,非常适合用于Android等移动设备.SAX解析XML文件采用的是事件驱动,也就是说, ...
- 解析XML文件的几种方式及其比较
解析xml文件目前比较流行的主要有四种方式: 1. DOM(Document Object Model)它把整个XML文档当成一个对象加载到内 存,不管文档有多大.它一般处理小文件 2.SAX(Si ...
- android中解析文件的三种方式
android中解析文件的三种方式 好久没有动手写点东西了,最近在研究android的相关技术,现在就android中解析文件的三种方式做以下总结.其主要有:SAX(Simple API fo ...
- 解析XML文件的几种常见操作方法—DOM/SAX/DOM4j
解析XML文件的几种常见操作方法—DOM/SAX/DOM4j 一直想学点什么东西,有些浮躁,努力使自己静下心来看点东西,哪怕是回顾一下知识.看到了xml解析,目前我还没用到过.但多了解一下,加深点记忆 ...
- java读取XML文件的四种方式
java读取XML文件的四种方式 Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT& ...
- Velocity中加载vm文件的三种方式
Velocity中加载vm文件的三种方式: a. 加载classpath目录下的vm文件 /** * 初始化Velocity引擎 * --VelocityEngine是单例模式,线程安全 * @th ...
- 前端js,css文件合并三种方式,bat命令
前端js,css文件合并三种方式,bat命令 前端js文件该如何合并三个方式如下:1. 一个大文件,所有js合并成一个大文件,所有页面都引用它.2. 各个页面大文件,各自页面合并生成自己所需js的大文 ...
随机推荐
- Grunt学习笔记【3】---- filter使用方式和实现原理详解
本文主要讲配置任务中的filter,包括使用默认fs.Stats方法名和自定义过滤函数,以及filter的实现原理. 通过设置filter属性可以实现一些特殊处理逻辑.例如:要清理某个文件夹下的所有空 ...
- Versions 崩溃(Mac升级OS X Yonsemite 10.10)
今天兴冲冲的升级到了OS X Yonsemite 10.10,结果发现SVN工具不能用了,于是找到一个暂时的解决的方法 1.打开目录~/.subversion/servers 2.在[global] ...
- 查找SAP 系统Parameter ID 4种方法
转自 http://blog.csdn.net/jy00873757/article/details/8517426 ***程序RPR_ABAP_SOURCE_SCAN 一.用F1,直接可以看到这个 ...
- Cortex-M3 Bit-Banding
Cortex-M3 Bit-Banding 1. 概述 CM3的存储器系统支持所谓的"位带"(bit-band)操作. 通过它,实现了对单一bit的原子操作.位带操作仅适用于一些特 ...
- react-native 支持 gif 图片
只需要在android/app/build.gradle中的dependencies字段中添加: compile 'com.facebook.fresco:animated-gif:0.13.0' 然 ...
- Javascript类型转换的规则实例解析
http://www.jb51.net/article/79916.htm 类型转换可以分为隐式转换和显式转换,所谓隐式转换即程序在运行时进行的自动转换,显式转换则是人为的对类型进行强制转换.Java ...
- 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 ...
- iOS开发 - 如何跳到系统设置里的各种设置界面
在iOS开发中,有时会有跳转系统设置界面的需求,例如提示用户打开蓝牙或者WIFI,提醒用户打开推送或者位置权限等.在iOS6之后,第三方应用需要跳转系统设置界面,需要在URL type中添加一个pre ...
- CI公用模型
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); /** * SEO管理系统 -- 公用模型 ...
- struts2的结果类型
1.从struts-default.xml入手,得到结果类型列表以及对应的处理类: <result-types> <!-- 转发到action --> <result-t ...