搜索
首页后端开发XML/RSS教程android三种操作XML的方法总结

android三种操作XML的方法总结

Apr 21, 2017 pm 05:13 PM
androidxml

在android中,操作xml文件,一般有几种方式:SAX操作,Pull操作,DOM操作等。其中DOM的方式,可能是大家最熟悉的,也是符合W3C标准的

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;}
@Overridepublic String toString() { return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";}
}


以上是android三种操作XML的方法总结的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
XML中的RSS:解码标签,属性和结构XML中的RSS:解码标签,属性和结构Apr 24, 2025 am 12:09 AM

RSS是一种基于XML的格式,用于发布和订阅内容。RSS文件的XML结构包括根元素、元素和多个元素,每个代表一个内容条目。通过XML解析器读取和解析RSS文件,用户可以订阅并获取最新内容。

XML在RSS中的优势:技术深度潜水XML在RSS中的优势:技术深度潜水Apr 23, 2025 am 12:02 AM

XML在RSS中具有结构化数据、可扩展性、跨平台兼容性和解析验证的优势。1)结构化数据确保内容的一致性和可靠性;2)可扩展性允许添加自定义标签以适应内容需求;3)跨平台兼容性使其在不同设备上无缝工作;4)解析和验证工具确保Feed的质量和完整性。

XML中的RSS:揭示内容联合的核心XML中的RSS:揭示内容联合的核心Apr 22, 2025 am 12:08 AM

RSS在XML中的实现方式是通过结构化的XML格式来组织内容。1)RSS使用XML作为数据交换格式,包含频道信息和项目列表等元素。2)生成RSS文件需按规范组织内容,发布到服务器供订阅。3)RSS文件可通过阅读器或插件订阅,实现内容自动更新。

超越基础:高级RSS文档功能超越基础:高级RSS文档功能Apr 21, 2025 am 12:03 AM

RSS的高级功能包括内容命名空间、扩展模块和条件订阅。1)内容命名空间扩展RSS功能,2)扩展模块如DublinCore或iTunes添加元数据,3)条件订阅根据特定条件筛选条目。这些功能通过添加XML元素和属性实现,提升信息获取效率。

XML主链:RSS提要如何结构XML主链:RSS提要如何结构Apr 20, 2025 am 12:02 AM

rssfeedsusexmltoStructureContentUpdates.1)xmlProvidesHierarchicalStructurefordata.2)theelementDefinestHefEed'sIdentityAndContainsElements.3)ElementsRementsRementsRepresSentividividividualContentpieces.4)rsssissisexisextensible,允许custemements.5)5)

RSS和XML:了解Web内容的动态二重奏RSS和XML:了解Web内容的动态二重奏Apr 19, 2025 am 12:03 AM

RSS和XML是用于网络内容管理的工具。RSS用于发布和订阅内容,XML用于存储和传输数据。它们的工作原理包括内容发布、订阅和更新推送。使用示例包括RSS发布博客文章和XML存储书籍信息。

RSS文档:Web联合组织的基础RSS文档:Web联合组织的基础Apr 18, 2025 am 12:04 AM

RSS文档是基于XML的结构化文件,用于发布和订阅频繁更新的内容。它的主要作用包括:1)自动化内容更新,2)内容聚合,3)提高浏览效率。通过RSSfeed,用户可以订阅并及时获取来自不同来源的最新信息。

解码RSS:内容提要的XML结构解码RSS:内容提要的XML结构Apr 17, 2025 am 12:09 AM

RSS的XML结构包括:1.XML声明和RSS版本,2.频道(Channel),3.条目(Item)。这些部分构成了RSS文件的基础,允许用户通过解析XML数据来获取和处理内容信息。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!