- 浏览: 132060 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
memoryisking:
可以看看这篇文章,构建一个简单的线程池,这个是struts教程 ...
java 线程池示例(自己实现的参考别人的代码) -
zwq194:
坑爹啊,误导人,代码有问题
java 线程池示例(自己实现的参考别人的代码) -
zhouming4455:
貌似你传错了哦
java 线程池示例(自己实现的参考别人的代码)
sax XML
- 博客分类:
- android 面试
andorid读取xml文件内容方法有三种 sax dom pull,其中 pull是android自带的
1.先认识一下xml文件中的些术语
Xml代码
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="23">
<name>李明</name>
<age>23</age>
</person>
<person id="22">
<name>李量</name>
<age>25</age>
</person>
</persons>
xml中的标签和内容都可以叫做节点,其中的persons person name age 这些都叫做元素(element).而像李明 25
这些值叫做文本节点.那么有个问题 中<persons>到<person>之间的是什么,什么都没有?
答案是他也是节点,是文本节点,你会说他里面什么都没有啊,错了,它有回车和空格.这个在sax解析xml中你debug一下就会发现.回车和空格(或者
是tab)是会被读取出来的.id是属性.
2.sax
sax是采用事件驱动,就是说他不需要完全读完xml文件,他是读到一个节点就解析一个节点是否符合xml语法,如果符合就调用相对应的方法其实就是回调方法,并且没有记忆功能.下面提到的这些方法都是在ContentHander()接口中的方法.
startDocumnet() :当开始解析xml文件的声明的时候就会触发这个事件, 可以做一些初始化的工作
startElement() 当开始解析元素的开始标签的时候,就会触发这个事件
characters() 当读到文本元素的时候要触发这个事件.
endElement() 当读到结束标签的时候 就会触发这个事件
sax就是这样按照顺序来解析的.
3.sax读取xml文件举例
3-1创建一个项目 ReadXml
3-2将xml文件拷贝到根目录下.
Xml代码
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="23">
<name>李明</name>
<age>23</age>
</person>
<person id="22">
<name>李量</name>
<age>25</age>
</person>
</persons>
可以看出这个xml文件中有一个可以抽象出来的对象 就是person 属性有id name age
那么我们就建立一个bean
3-3:创建bean
Java代码
package com.leequer.service.demo;
/**
* <person id="23">
<name>李明</name>
<age>23</age>
</person>
<person id="22">
<name>李量</name>
<age>25</age>
</person>
* @author leequer
*
* xml文件对应的bean
*/
public class Person {
private Integer id;
private String name;
private int age;
public Person ()
{}
public Person (String name ,int age)
{
this.name = name;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return this.id+",name "+this.name+" age "+this.age+"\n";
}
}
3-4:遵循mvc的架构,我们建立一个service用来读取xml
Java代码
package com.leequer.service;
import java.io.InputStream;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.XMLReader;
import com.leequer.service.demo.Person;
public class SaxReadxml {
public static List<Person> readXml(InputStream inStream)throws Exception {
SAXParserFactory spf = SAXParserFactory.newInstance(); // 初始化sax解析器
SAXParser sp = spf.newSAXParser(); // 创建sax解析器
//XMLReader xr = sp.getXMLReader();// 创建xml解析器
XMLContentHandler handler = new XMLContentHandler();
sp.parse(inStream, handler);
return handler.getPersons();
}
}
sp.parse(inStream, handler);
这句可以看出xml文件是以流的形式传进来的,参数handler就是回调函数的实例,当sax解析器解析xml文件的时候当遇到符合xml的内容就会去
handle类中调用对应的上面提到的方法.那我们建立这个XMLContentHandler
就要求这个类要实现ContentHandler()这个接口,但是这个接口中有很多需要实现的方法.sax提供了一个DefaultHandler接口
只要实现这个接口中你感兴趣的方法就可以了.
3-5:创建XMLContentHandler 并完成读取时的事件的实现 注意看注释
Java代码
package com.leequer.service;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import com.leequer.service.demo.Person;
public class XMLContentHandler extends DefaultHandler {
private List<Person> persons;
private Person person;
private String tempString;
private static final String NAMESTRING = "name";
private static final String AGESTRING = "age";
private static final String PERSONSTRING = "person";
private static final String IDSTRING = "id";
public List<Person> getPersons() {
return persons;
}
/**
* sax 解析文件不带记忆,只读取 对xml文件中的 <person id="23"> <name>李明</name> <age>23</age>
* </person> <person id="22"> <name>李量</name> <age>25</age> </person> 这部分感兴趣
* 那么这部分包含了person这个节点元素的开始和结尾,那么就要有startElement和endElement
* 这两个方法;还有text的节点元素,(就是像节点之间的回车和空格还有标签中的像李明这样的文字都是文本节点 元素
* (text节点元素)那么要解析文本节点元素就要用到characters 这个方法来获取信息。)
*/
/**
* 要开始读取xml文件的时候调用的方法
* 初始化persons
*/
@Override
public void startDocument() throws SAXException {
//这里做list的初始化工作
persons = new ArrayList<Person>();
}
/**
* sax 读取到文本节点的时候调用了这个方法
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (person != null) {
String valueString = new String(ch, start, length);
if (NAMESTRING.equals(tempString)) {
// 如果当前解析到的节点是name 就要将name中的文本节点元素的值得到
person.setName(valueString);
} else if (AGESTRING.equals(tempString)) {
person.setAge(new Integer(valueString).intValue());
}
}
}
/**
* sax 读取到元素节点的时候用到这个方法;
*/
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
// 先判断读到的元素是否是person
if (PERSONSTRING.equals(localName)) {
// 如果读到的是person这个元素 就要保存起来,保存在我们创建的那个person的类中 所以我们要new一个person类
person = new Person();
// attributes是属性。
person.setId(new Integer(attributes.getValue(IDSTRING)));
}
tempString = localName;
}
/**
* 这个方法是每次遇到结束的标签都会执行的 并不是只遇到最后的结尾才调用
*
* 读取完毕遇到person'的结尾 就将封装好的一个personbean保存到list中 并且清空person对象
*
*/
@Override
public void endElement(String uri, String localName, String name)
throws SAXException {
if(PERSONSTRING.equals(localName)&&person!=null)
{
persons.add(person);
person = null;
}
tempString = null;
}
}
3-6:写个测试类来实验 将xml文件装载入 然后读取
package com.leequer.readxml;
/**
* 测试类
*/
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import com.leequer.service.SaxReadxml;
import com.leequer.service.demo.Person;
import android.test.AndroidTestCase;
import android.util.Log;
public class SaxReadxmlTest extends AndroidTestCase {
private String PERSONSTRING = "ObjectPerson";
public void testReadXml() throws Exception
{//类装载器
InputStream inputStream = SaxReadxmlTest.class.getClassLoader().getResourceAsStream("NewFile.xml");
List <Person> personsList = SaxReadxml.readXml(inputStream);
for (Iterator iterator = personsList.iterator(); iterator.hasNext();) {
Person person = (Person) iterator.next();
Log.i(PERSONSTRING, person.toString());
}
}
}
发表评论
-
Android实现数据存储技术
2013-03-21 10:33 834本文介绍Android中的5种 ... -
横竖屏
2013-01-11 13:40 799总结: 1、不设置Activity的android:co ... -
代码调用menu
2013-01-10 09:17 1046<!-- @pa ... -
Java内部类的使用小结
2012-12-02 09:37 881Java内部类的使用小结 1. 成员内部类 ... -
面试
2012-11-28 14:10 895以下面试题都是在网 ... -
Activity的taskAffinity属性
2012-11-28 09:21 918Activity的归属,也就是Activity应该在 ... -
Activity intent经常使用的 FLAG 集合
2012-11-15 16:32 913Activity intent经常使用的 FLAG 集合 ... -
Activity生命周期
2012-11-14 17:02 774Activity生命周期的基本内容我就不多说了,网上一搜一大 ... -
[转]Android的状态保存及恢复的触发的时机
2012-10-16 18:42 675先看Application Fundamentals ... -
startService()和bindService()区别(转载)
2012-10-13 11:05 144921. 生命周期: startServ ... -
WIFI 定位
2012-10-08 19:40 898http://www.cnblogs.com/coffeegg ... -
Android使用Application总结
2012-09-22 11:56 824Android使用Application总结 ... -
70道经典Android面试题加答案--重要知识点几乎都涉及到了
2012-05-05 23:41 13641. 下列哪些语 ...
相关推荐
本篇文章将详细探讨Android中的SAX(Simple API for XML)解析方式,并提供一个简单的SAX XML解析Demo。 SAX解析是基于事件驱动的解析模型,它不会一次性加载整个XML文档到内存,而是逐行读取,当遇到特定的XML元素...
SAX(Simple API for XML)是XML解析器的一种,它以事件驱动的方式解析XML文档,而非DOM(Document Object Model)解析器那样将整个XML文档加载到内存中。SAX解析器在处理大型XML文件时更高效,因为它只在需要时读取...
Java作为一种强大的编程语言,提供了多种解析XML文档的方法,其中包括DOM(Document Object Model)和SAX(Simple API for XML)。本压缩包文件“XML-java.rar”包含了关于使用Java解析XML的实例,特别强调了SAX解析...
在Java中,处理XML文件主要有两种解析器:DOM(Document Object Model)和SAX(Simple API for XML)。这两种解析方式各有特点,适用于不同的场景。 1. DOM解析: DOM解析器将整个XML文档加载到内存中,构建一个树...
在处理大型XML文件时,为了提高效率,通常会采用两种解析器:DOM(Document Object Model)和SAX(Simple API for XML)。本文将重点讨论SAX解析器,并通过描述中的"test_sax.rar"压缩包中的示例,讲解如何使用SAX...
本资料包“xml.rar”主要关注Android环境下的XML解析,特别是SAX解析器,同时也涵盖了DOM和Pull解析方式。 1. XML基本概念: XML是一种自描述性的标记语言,它通过标签来定义数据结构。每个XML文档都包含元素、...
Java作为一款强大的编程语言,提供了多种处理XML的API,其中包括DOM(Document Object Model)和SAX(Simple API for XML)。本教程将帮助初学者深入理解这两种解析XML的方法。 1. DOM解析器 DOM解析器将整个XML...
为了解决这个问题,我们可以采用流式解析的方式,比如SAX(Simple API for XML)。SAX解析器逐行读取XML文件,只在需要时处理数据,显著降低了内存需求。 SAX解析的核心在于事件驱动模型。当解析器读取XML文件时,...
在Java中,有多种方式可以解析XML文档,其中最常用的是DOM(Document Object Model)和SAX(Simple API for XML)。本篇文章将详细介绍DOM和SAX解析XML的方法,并通过提供的`DomDemo.java`和`SaxDemo.java`示例代码...
SAX解析XML文件的实例。一个项目同时用dom解析和sax解析xml文件貌似会报错,项目框架建一直是用sax和dom4j解析xml文件的。当我用dom解析xml文件。导入包后就报错识别不了xml文件的编码格式。于是做了一个sax解析xml...
This can handle the xml Api source file
在处理XML时,我们通常会使用三种主要的解析方式:DOM(Document Object Model)、SAX(Simple API for XML)和XPath(XML Path Language)。下面将详细介绍这三种解析方法,并结合实例进行讲解。 1. DOM解析: DOM...
SAX(Simple API for XML)是XML解析的一种方法,它以事件驱动的方式处理XML文档,非常适合处理大体积的XML文件,因为它不需要一次性加载整个文件到内存,而是逐行读取,因此节省了资源。 **SAX解析XML的基本原理:...
《VC++实现的SAX XML解析器:非连续性分析详解》 XML(eXtensible Markup Language)作为一种通用的数据交换格式,广泛应用于各种软件系统之间的数据交互。在处理大型XML文档时,为了提高效率和节省内存,通常采用...
sax读取xml文件并反射到对应的实体中
XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置文件、文档存储等领域。...在本示例的压缩包文件"SaxXml"中,可能包含了一个使用SAX解析XML的示例代码或教程,供学习者参考。
SAX(Simple API for XML)是XML解析器的一种,它采用事件驱动的方式对XML文档进行解析,而不是一次性加载整个文档到内存中,因此在处理大型XML文件时,SAX解析器具有较高的性能和较低的内存消耗。 标题“sax解析...
SAX(Simple API for XML)是一种轻量级的XML解析技术,主要用于读取XML文档。相较于DOM(Document Object Model)解析器,SAX解析器占用更少的内存和处理时间,因为它不会一次性加载整个XML文档到内存,而是采用...
Java SAX(Simple API for XML)解析器是一种基于事件驱动的XML解析方式,它不将整个XML文档加载到内存中,而是逐行读取,当遇到某个事件(如开始标签、结束标签等)时,会触发相应的事件处理器方法。这种方式节省了...
在Android和Java编程中,处理XML文件是常见的任务,而SAX(Simple API for XML)是一种轻量级、事件驱动的XML解析器,它以流式方式读取XML文档,只在需要时解析内容,因此非常适合处理大体积的XML文件。 SAX解析器...