android中数据存储及对xml的解析.docx
- 文档编号:27478800
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:10
- 大小:17.38KB
android中数据存储及对xml的解析.docx
《android中数据存储及对xml的解析.docx》由会员分享,可在线阅读,更多相关《android中数据存储及对xml的解析.docx(10页珍藏版)》请在冰豆网上搜索。
android中数据存储及对xml的解析
android中数据存储及对xml的解析
这几天恶补了一下XML解析,还是不够透彻呀,还是先打个钉吧。
。
。
XML作为一种业界公认的数据交换格式,在各个平台与语言之上,都有广泛使用和实现。
其标准型,可靠性,安全性......毋庸置疑。
在android平台上,我们要想实现数据存储和数据交换,经常会使用到xml数据格式和xml文件。
小提示:
android中存储数据一般有如下几种:
SharedPreferences(参数化),XML文件,sqllite数据库,网络,ContentProvider(内容提供者)等。
在android中,操作xml文件,一般有几种方式:
SAX操作,Pull操作,DOM操作等。
其中DOM的方式,可能是大家最熟悉的,也是符合W3C标准的。
1)
在java平台中,有诸如DOM4J这样优秀的开源包,极大程度的方便大家使用DOM标准来操作XML文件。
在javascript中,不同的浏览器解析引擎,对DOM的解析和操作也略有差异(不过这不是本章介绍的重点)。
而DOM的方式,也有其缺点。
通常一次性加载xml文件,再使用DOM的api去进行解析,这样很大程度的消耗内存,对性能会有一定影响。
而我们的android手机,虽然配置在不断的升级,但是内存方面,暂时还无法与传统的PC去媲美。
所以,在android开发中,个人不太推荐使用DOM的方式来解析和操作XML。
[java]viewplaincopy
packagecn.itcast.service;
importjava.io.InputStream;
importjava.util.ArrayList;
importjava.util.List;
importjavax.xml.parsers.DocumentBuilder;
importjavax.xml.parsers.DocumentBuilderFactory;
importorg.w3c.dom.Document;
importorg.w3c.dom.Element;
importorg.w3c.dom.Node;
importorg.w3c.dom.NodeList;
importcn.itcast.model.Person;
publicclassDomPersonService{
publicListgetPersons(InputStreamstream)throwsThrowable
{
Listlist=newArrayList();
DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
DocumentBuilderbuilder=factory.newDocumentBuilder();
Documentdom=builder.parse(stream);//解析完成,并以dom树的方式存放在内存中。
比较消耗性能
//开始使用dom的api去解析
Elementroot=dom.getDocumentElement();//根元素
NodeListpersonNodes=root.getElementsByTagName_r("person");//返回所有的person元素节点
//开始遍历啦
for(inti=0;i
{
Personperson=newPerson();
ElementpersonElement=(Element)personNodes.item(i);
person.setId(newInteger(personElement.getAttribute("id")));//将person元素节点的属性节点id的值,赋给person对象
NodeListpersonChildrenNodes=personElement.getChildNodes();//获取person节点的所有子节点
//遍历所有子节点
for(intj=0;j
{
//判断子节点是否是元素节点(如果是文本节点,可能是空白文本,不处理)
if(personChildrenNodes.item(j).getNodeType()==Node.ELEMENT_NODE)
{
//子节点--元素节点
ElementchildNode=(Element)personChildrenNodes.item(j);
if("name".equals(childNode.getNodeName()))
{
//如果子节点的名称是“name”.将子元素节点的第一个子节点的值赋给person对象
person.setName(childNode.getFirstChild().getNodeValue());
}elseif("age".equals(childNode.getNodeValue()))
{
person.setAge(newInteger(childNode.getFirstChild().getNodeValue()));
}
}
}
list.add(person);
}
returnlist;
}
}
2)
SAX(SimpleAPIforXML),是一个使用非常广泛的XML解析标准,通常使用Handler模式来处理XML文档,这种处理模式和我们平常习惯的理解方式很不同,身边也经常有一些朋友在刚接触SAX的时候会觉得理解起来有些困难。
其实SAX并不复杂,只不过是换了一种思维方式,正如它的名字所表示的,为了让我们以更简单的方式来处理XML文档,下面我们就开始吧。
[java]viewplaincopy
packagecn.itcast.service;
importjava.io.InputStream;
importjava.util.ArrayList;
importjava.util.List;
importjavax.xml.parsers.SAXParser;
importjavax.xml.parsers.SAXParserFactory;
importorg.xml.sax.Attributes;
importorg.xml.sax.SAXException;
importorg.xml.sax.helpers.DefaultHandler;
importcn.itcast.model.Person;
publicclassSAXPersonService{
publicListgetPersons(InputStreaminStream)throwsThrowable
{
SAXParserFactoryfactory=SAXParserFactory.newInstance();//工厂模式还是单例模式?
SAXParserparser=factory.newSAXParser();
PersonParsepersonParser=newPersonParse();
parser.parse(inStream,personParser);
inStream.close();
returnpersonParser.getPerson();
}
privatefinalclassPersonParseextendsDefaultHandler
{
privateListlist=null;
Personperson=null;
privateStringtag=null;
publicListgetPerson(){
returnlist;
}
@Override
publicvoidstartDocument()throwsSAXException{
list=newArrayList();
}
@Override
publicvoidstartElement(Stringuri,StringlocalName,StringqName,
Attributesattributes)throwsSAXException{
if("person".equals(localName))
{
//xml元素节点开始时触发,是“person”
person=newPerson();
person.setId(newInteger(attributes.getValue(0)));
}
tag=localName;//保存元素节点名称
}
@Override
publicvoidendElement(Stringuri,StringlocalName,StringqName)
throwsSAXException{
//元素节点结束时触发,是“person”
if("person".equals(localName))
{
list.add(person);
person=null;
}
tag=null;//结束时,需要清空tag
}
@Override
publicvoidcharacters(char[]ch,intstart,intlength)
throwsSAXException{
if(tag!
=null)
{
Stringdata=newString(ch,start,length);
if("name".equals(tag))
{
person.setName(data);
}elseif("age".equals(tag))
{
person.setAge(newInteger(data));
}
}
}
}
}
3)
Pull解析和Sax解析很相似,都是轻量级的解析,在Android的内核中已经嵌入了Pull,所以我们不需要再添加第三方jar包来支持Pull。
Pull解析和Sax解析不一样的地方有
(1)pull读取xml文件后触发相应的事件调用方法返回的是数字
(2)pull可以在程序中控制想解析到哪里就可以停止解析。
[java]viewplaincopy
packagecn.itcast.service;
importjava.io.InputStream;
importjava.io.Writer;
importjava.util.ArrayList;
importjava.util.List;
importorg.xmlpull.v1.XmlPullParser;
importorg.xmlpull.v1.XmlSerializer;
importandroid.util.Xml;
importcn.itcast.model.Person;
publicclassPullPersonService{
//保存xml文件
publicstaticvoidsaveXML(Listlist,Writerwrite)throwsThrowable
{
XmlSerializerserializer=Xml.newSerializer();//序列化
serializer.setOutput(write);//输出流
serializer.startDocument("UTF-8",true);//开始文档
serializer.startTag(null,"persons");
//循环去添加person
for(Personperson:
list){
serializer.startTag(null,"person");
serializer.attribute(null,"id",person.getId().toString());//设置id属性及属性值
serializer.startTag(null,"name");
serializer.text(person.getName());//文本节点的文本值--name
serializer.endTag(null,"name");
serializer.startTag(null,"age");
serializer.text(person.getAge().toString());//文本节点的文本值--age
serializer.endTag(null,"age");
serializer.endTag(null,"person");
}
serializer.endTag(null,"persons");
serializer.endDocument();
write.flush();
write.close();
}
publicListgetPersons(InputStreamstream)throwsThrowable
{
Listlist=null;
Personperson=null;
XmlPullParserparser=Xml.newPullParser();
parser.setInput(stream,"UTF-8");
inttype=parser.getEventType();//产生第一个事件
//只要当前事件类型不是”结束文档“,就去循环
while(type!
=XmlPullParser.END_DOCUMENT)
{
switch(type){
caseXmlPullParser.START_DOCUMENT:
list=newArrayList();
break;
caseXmlPullParser.START_TAG:
Stringname=parser.getName();//获取解析器当前指向的元素名称
if("person".equals(name))
{
person=newPerson();
person.setId(newInteger(parser.getAttributeValue(0)));
}
if(person!
=null)
{
if("name".equals(name))
{
person.setName(parser.nextText());//获取解析器当前指向的元素的下一个文本节点的文本值
}
if("age".equals(name))
{
person.setAge(newInteger(parser.nextText()));
}
}
break;
caseXmlPullParser.END_TAG:
if("person".equals(parser.getName()))
{
list.add(person);
person=null;
}
break;
}
type=parser.next();//这句千万别忘了哦
}
returnlist;
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- android 数据 存储 xml 解析