gpt4 book ai didi

android操作XML的几种方法总结

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章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,

import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory,

import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList,

import cn.itcast.model.Person,

public class DomPersonService { 。

  public List<Person> getPersons(InputStream stream) throws Throwable   {    List<Person> list =new ArrayList<Person>();    DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();    DocumentBuilder builder =factory.newDocumentBuilder();   Document dom = builder.parse(stream);//解析完成,并以dom树的方式存放在内存中。比较消耗性能    //开始使用dom的api去解析    Element root = dom.getDocumentElement();//根元素   NodeList personNodes = root.getElementsByTagName("person");//返回所有的person元素节点   //开始遍历啦   for(int i=0;i<personNodes.getLength();i++)   {    Person person =new Person();   Element personElement =(Element)personNodes.item(i);     person.setId(new Integer( personElement.getAttribute("id")));//将person元素节点的属性节点id的值,赋给person对象     NodeList personChildrenNodes =personElement.getChildNodes();//获取person节点的所有子节点     //遍历所有子节点     for(int j=0;j<personChildrenNodes.getLength();j++)     {      //判断子节点是否是元素节点(如果是文本节点,可能是空白文本,不处理)      if(personChildrenNodes.item(j).getNodeType()==Node.ELEMENT_NODE)      {       //子节点--元素节点       Element childNode =(Element)personChildrenNodes.item(j);          if("name".equals(childNode.getNodeName()))          {           //如果子节点的名称是“name”.将子元素节点的第一个子节点的值赋给person对象           person.setName(childNode.getFirstChild().getNodeValue());          }else if("age".equals(childNode.getNodeValue()))          {           person.setAge(new Integer(childNode.getFirstChild().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,

import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory,

import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler,

import cn.itcast.model.Person,

public class SAXPersonService {    public List<Person> getPersons(InputStream inStream) throws Throwable    {     SAXParserFactory factory = SAXParserFactory.newInstance();//工厂模式还是单例模式?     SAXParser parser =factory.newSAXParser();     PersonParse personParser =new PersonParse();     parser.parse(inStream, personParser);     inStream.close();     return personParser.getPerson();    }    private final class PersonParse extends DefaultHandler    {    private List<Person> list = null;     Person person =null;     private String tag=null;     public List<Person> getPerson() {   return list;  }     @Override  public void startDocument() throws SAXException {   list =new ArrayList<Person>();  } 。

 @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 Integer(attributes.getValue(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,

import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlSerializer,

import android.util.Xml,

import cn.itcast.model.Person,

public class PullPersonService {  //保存xml文件  public static void saveXML(List<Person> list,Writer write)throws Throwable  {   XmlSerializer serializer =Xml.newSerializer();//序列化   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", 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();  }   public List<Person> getPersons(InputStream stream) throws Throwable   {    List<Person> list =null;      Person person =null;      XmlPullParser parser =Xml.newPullParser();      parser.setInput(stream,"UTF-8");      int type =parser.getEventType();//产生第一个事件      //只要当前事件类型不是”结束文档“,就去循环      while(type!=XmlPullParser.END_DOCUMENT)      {      switch (type) {   case XmlPullParser.START_DOCUMENT:   list = new ArrayList<Person>();    break,

  case XmlPullParser.START_TAG:    String name=parser.getName();//获取解析器当前指向的元素名称    if("person".equals(name))    {     person =new Person();     person.setId(new Integer(parser.getAttributeValue(0)));    }    if(person!=null)    {     if("name".equals(name))     {      person.setName(parser.nextText());//获取解析器当前指向的元素的下一个文本节点的文本值     }     if("age".equals(name))     {      person.setAge(new Integer(parser.nextText()));     }    }    break;   case XmlPullParser.END_TAG:    if("person".equals(parser.getName()))    {     list.add(person);     person=null;    }    break;   }      type=parser.next();//这句千万别忘了哦      }    return list;   } } 。

下面是Model层的Person类的代码:

复制代码 代码如下:

package cn.itcast.model,

  。

public class Person { private Integer id; public Integer getId() {  return id; } public void setId(Integer id) {  this.id = id; } 。

private String name; public String getName() {  return name; } 。

public void setName(String name) {  this.name = name; } 。

private Integer age; public Integer getAge() {  return age; } 。

public void setAge(Integer age) {  this.age = age; } 。

public Person() { } public Person(Integer id, String name, Integer age) {  this.id = id;  this.name = name;  this.age = age; } 。

@Override public String toString() {  return "Person [id=" + id + ", name=" + name + ", age=" + age + "]"; } 。

} 。

  。

最后此篇关于android操作XML的几种方法总结的文章就讲到这里了,如果你想了解更多关于android操作XML的几种方法总结的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com