androidxml使⽤⽅法,android操作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。
package cn.itcast.service;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
l.parsers.DocumentBuilder;
l.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import del.Person;
public class DomPersonService {
public List getPersons(InputStream stream) throws Throwable
{
List list =new ArrayList();
DocumentBuilderFactory factory =wInstance();
DocumentBuilder builder =wDocumentBuilder();
Document dom = builder.parse(stream);//解析完成,并以dom树的⽅式存放在内存中。⽐较消耗性能
//开始使⽤dom的api去解析
Element root = DocumentElement();//根元素
NodeList personNodes = ElementsByTagName("person");//返回所有的person元素节点使用dom4j解析xml文件
//开始遍历啦
for(int i=0;i
{
Person person =new Person();
Element personElement =(Element)personNodes.item(i);
person.setId(new Integer( Attribute("id")));//将person元素节点的属性节点id的值,赋给person对象
NodeList personChildrenNodes =ChildNodes();//获取person节点的所有⼦节点
//遍历所有⼦节点
for(int j=0;j
{
//判断⼦节点是否是元素节点(如果是⽂本节点,可能是空⽩⽂本,不处理)
if(personChildrenNodes.item(j).getNodeType()==Node.ELEMENT_NODE)
{
//⼦节点--元素节点
Element childNode =(Element)personChildrenNodes.item(j);
if("name".NodeName()))
{
//如果⼦节点的名称是“name”.将⼦元素节点的第⼀个⼦节点的值赋给person对象
person.FirstChild().getNodeValue());
}else if("age".NodeValue()))
{
person.setAge(new FirstChild().getNodeValue()));
}
}
}
list.add(person);
}
return list;
}
}
2)
SAX(Simple API for XML),是⼀个使⽤⾮常⼴泛的XML解析标准,通常使⽤Handler模式来处理XML⽂档,这种处理模式和我们平常习惯的理解⽅式很不同,⾝边也经常有⼀些朋友在刚接触SAX的时候会觉得理解起来有些困难。其实SAX并不复杂,只不过是换了⼀种思维⽅式,正如它的名字所表⽰的,为了让我们以更简单的⽅式来处理XML⽂档,下⾯我们就开始吧。
package cn.itcast.service;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
l.parsers.SAXParser;
l.parsers.SAXParserFactory;
l.sax.Attributes;
l.sax.SAXException;
l.sax.helpers.DefaultHandler;
import del.Person;
public class SAXPersonService {
public List getPersons(InputStream inStream) throws Throwable
{
SAXParserFactory factory = wInstance();//⼯⼚模式还是单例模式?SAXParser parser =wSAXParser();
PersonParse personParser =new PersonParse();
parser.parse(inStream, personParser);
inStream.close();
Person();
}
private final class PersonParse extends DefaultHandler
{
private List list = null;
Person person =null;
private String tag=null;
public List getPerson() {
return list;
}
@Override
public void startDocument() throws SAXException {
list =new ArrayList();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if("person".equals(localName))
{
//xml元素节点开始时触发,是“person”
person = new Person();
person.setId(new Value(0)));
}
tag =localName;//保存元素节点名称
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
/
/元素节点结束时触发,是“person”
if("person".equals(localName))
{
list.add(person);
person=null;
}
tag =null;//结束时,需要清空tag
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(tag!=null)
{
String data = new String(ch,start,length);
if("name".equals(tag))
{
person.setName(data);
}else if("age".equals(tag))
{
person.setAge(new Integer(data));
}
}
}
}
}
3)
Pull解析和Sax解析很相似,都是轻量级的解析,在Android的内核中已经嵌⼊了Pull,所以我们不需要再添加第三⽅jar包来⽀持Pull。Pull 解析和Sax解析不⼀样的地⽅有(1)pull读取xml⽂件后触发相应的事件调⽤⽅法返回的是数字(2)pull可以在程序中控制想解析到哪⾥就可以停⽌解析。
package cn.itcast.service;
import java.io.InputStream;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
lpull.v1.XmlPullParser;
lpull.v1.XmlSerializer;
import android.util.Xml;
import del.Person;
public class PullPersonService {
//保存xml⽂件
public static void saveXML(List list,Writer write)throws Throwable
{
XmlSerializer serializer =wSerializer();//序列化
serializer.setOutput(write);//输出流
serializer.startDocument("UTF-8", true);//开始⽂档
serializer.startTag(null, "persons");
//循环去添加person
for (Person person : list) {
serializer.startTag(null, "person");
serializer.attribute(null, "id", Id().toString());//设置id属性及属性值
serializer.startTag(null, "name");
<(Name());//⽂本节点的⽂本值--name
serializer.startTag(null, "age");
<(Age().toString());//⽂本节点的⽂本值--age
}
write.flush();
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论