解析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的大文 ...
随机推荐
- python中的raw字符串
在正则表达式的字符串前面加上r表示这个是一个raw字符串,只以正则表达式的元字符进行解析,不用理会ascii的特殊字符.
- 【题解】P1613跑路
[题解]P1613 鸽王跑路 一道思维好题! 考虑\(2^k\)的传递性.直接64遍\(floyd\)求所有\(2^k\)的路径,转移方程是 \(dp(i,j,k)=[dp[i][t][k-1]\)& ...
- 在JDK 6和JDK 7的substring()方法的区别?
原文链接:https://www.programcreek.com/2013/09/the-substring-method-in-jdk-6-and-jdk-7/ 在JDK 6和JDK 7中subs ...
- Android RelativeLayout相对布局
RelativeLayout是相对布局控件:以控件之间相对位置或相对父容器位置进行排列. 相对布局常用属性: 子类控件相对子类控件:值是另外一个控件的id android:layout_above-- ...
- Linux (ubuntu和redhat) 常用命令及细节
1.关闭防火墙(Ubuntu) sudo ufw disable 2.vi 拷贝 参考http://blog.sina.com.cn/s/blog_601331150100ecfr.html 一) ...
- 转载:Java知多少(8)类库及其组织结构
转载地址:http://www.cnblogs.com/Coda/p/4346151.html Java知多少(8)类库及其组织结构 Java 官方为开发者提供了很多功能强大的类,这些类被分别放在各个 ...
- JMS消息可靠机制
ActiveMQ消息签收机制: 客戶端成功接收一条消息的标志是一条消息被签收,成功应答. 消息的签收情形分两种: 1.带事务的session 如果session带有事务,并且事务成功提交,则消息被自动 ...
- 白话 P-value
准备再尝试一下,用大白话叙述一遍统计推断中最基础的东西(假设检验.P值.……),算是把这段时间的阅读和思考做个梳理(东西不难,思考侧重在如何表述和展示).这次打算用一种“迂回的”表达方式,比如,本文从 ...
- JAVA-配置path环境
配置path环境变量变的目的是什么? 控制台可以在任意的路径下都可以找到java的开发工具. 为了说明几个JDK环境变量的作用,这里先给出环境变量的定义 环境变量: 环境变量一般是指在操作系统中用来指 ...
- Android窗口系统第三篇---WindowManagerService中窗口的组织方式
Android窗口系统第一篇—Window的类型与Z-Order确定 Android窗口系统第二篇—Window的添加过程 上面文章梳理了一个窗口的添加过程,系统中有很多应用,每个应用有多个Activ ...