亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

android操作XML的幾種方式

original 2016-11-11 14:10:49 617
abstrait:XML作為一種業(yè)界公認(rèn)的數(shù)據(jù)交換格式,在各個(gè)平臺(tái)與語言之上,都有廣泛使用和實(shí)現(xiàn)。其標(biāo)準(zhǔn)型,可靠性,安全性......毋庸置疑。在android平臺(tái)上,我們要想實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)交換,經(jīng)常會(huì)使用到xml數(shù)據(jù)格式和xml文件。小提示:android中存儲(chǔ)數(shù)據(jù)一般有如下幾種:SharedPreferences(參數(shù)化),XML文件,sqllite數(shù)據(jù)庫,網(wǎng)絡(luò),ContentProvider(內(nèi)容提供者)

XML作為一種業(yè)界公認(rèn)的數(shù)據(jù)交換格式,在各個(gè)平臺(tái)與語言之上,都有廣泛使用和實(shí)現(xiàn)。其標(biāo)準(zhǔn)型,可靠性,安全性......毋庸置疑。在android平臺(tái)上,我們要想實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)交換,經(jīng)常會(huì)使用到xml數(shù)據(jù)格式和xml文件。

小提示:android中存儲(chǔ)數(shù)據(jù)一般有如下幾種:SharedPreferences(參數(shù)化),XML文件,sqllite數(shù)據(jù)庫,網(wǎng)絡(luò),ContentProvider(內(nèi)容提供者)等。

在android中,操作xml文件,一般有幾種方式:SAX操作,Pull操作,DOM操作等。其中DOM的方式,可能是大家最熟悉的,也是符合W3C標(biāo)準(zhǔn)的。

1)

在java平臺(tái)中,有諸如DOM4J這樣優(yōu)秀的開源包,極大程度的方便大家使用DOM標(biāo)準(zhǔn)來操作XML文件。在javascript中,不同的瀏覽器解析引擎,對(duì)DOM的解析和操作也略有差異(不過這不是本章介紹的重點(diǎn))。而DOM的方式,也有其缺點(diǎn)。通常一次性加載xml文件,再使用DOM的 api去進(jìn)行解析,這樣很大程度的消耗內(nèi)存,對(duì)性能會(huì)有一定影響。而我們的android手機(jī),雖然配置在不斷的升級(jí),但是內(nèi)存方面,暫時(shí)還無法與傳統(tǒng)的PC去媲美。所以,在android開發(fā)中,個(gè)人不太推薦使用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樹的方式存放在內(nèi)存中。比較消耗性能
         //開始使用dom的api去解析
         Element root = dom.getDocumentElement();//根元素
        NodeList personNodes = root.getElementsByTagName("person");//返回所有的person元素節(jié)點(diǎn)
        //開始遍歷啦
        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元素節(jié)點(diǎn)的屬性節(jié)點(diǎn)id的值,賦給person對(duì)象
          NodeList personChildrenNodes =personElement.getChildNodes();//獲取person節(jié)點(diǎn)的所有子節(jié)點(diǎn)
          //遍歷所有子節(jié)點(diǎn)
          for(int j=0;j<personChildrenNodes.getLength();j++)
          {
              //判斷子節(jié)點(diǎn)是否是元素節(jié)點(diǎn)(如果是文本節(jié)點(diǎn),可能是空白文本,不處理)
              if(personChildrenNodes.item(j).getNodeType()==Node.ELEMENT_NODE)
              {
                  //子節(jié)點(diǎn)--元素節(jié)點(diǎn)
                  Element childNode =(Element)personChildrenNodes.item(j);
                  if("name".equals(childNode.getNodeName()))
                  {
                      //如果子節(jié)點(diǎn)的名稱是“name”.將子元素節(jié)點(diǎn)的第一個(gè)子節(jié)點(diǎn)的值賦給person對(duì)象
                      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),是一個(gè)使用非常廣泛的XML解析標(biāo)準(zhǔn),通常使用Handler模式來處理XML文檔,這種處理模式和我們平常習(xí)慣的理解方式很不同,身邊也經(jīng)常有一些朋友在剛接觸SAX的時(shí)候會(huì)覺得理解起來有些困難。其實(shí)SAX并不復(fù)雜,只不過是換了一種思維方式,正如它的名字所表示的,為了讓我們以更簡單的方式來處理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元素節(jié)點(diǎn)開始時(shí)觸發(fā),是“person”
            person = new Person();
            person.setId(new Integer(attributes.getValue(0)));
        }
        tag =localName;//保存元素節(jié)點(diǎn)名稱
    }
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        //元素節(jié)點(diǎn)結(jié)束時(shí)觸發(fā),是“person”
        if("person".equals(localName))
        {
            list.add(person);
            person=null;
        }
        tag =null;//結(jié)束時(shí),需要清空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解析很相似,都是輕量級(jí)的解析,在Android的內(nèi)核中已經(jīng)嵌入了Pull,所以我們不需要再添加第三方j(luò)ar包來支持Pull。Pull解析和Sax解析不一樣的地方有(1)pull讀取xml文件后觸發(fā)相應(yīng)的事件調(diào)用方法返回的是數(shù)字(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");
        //循環(huán)去添加person
        for (Person person : list) {
            serializer.startTag(null, "person");
            serializer.attribute(null, "id", person.getId().toString());//設(shè)置id屬性及屬性值
            serializer.startTag(null, "name");
            serializer.text(person.getName());//文本節(jié)點(diǎn)的文本值--name
            serializer.endTag(null, "name");
            serializer.startTag(null, "age");
            serializer.text(person.getAge().toString());//文本節(jié)點(diǎn)的文本值--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();//產(chǎn)生第一個(gè)事件
        //只要當(dāng)前事件類型不是”結(jié)束文檔“,就去循環(huán)
        while(type!=XmlPullParser.END_DOCUMENT)
        {
        switch (type) {
        case XmlPullParser.START_DOCUMENT:
        list =    new ArrayList<Person>();
            break;

        case XmlPullParser.START_TAG:
            String name=parser.getName();//獲取解析器當(dāng)前指向的元素名稱
            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());//獲取解析器當(dāng)前指向的元素的下一個(gè)文本節(jié)點(diǎn)的文本值
                }
                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 + "]";
}

}

看完本文中的示例,相信你已經(jīng)理解了android中訪問和操作xml數(shù)據(jù)的幾種方式。讀者不妨動(dòng)手去敲代碼、調(diào)試,可以很方便的利用模擬器進(jìn)行單元測試。

Notes de version

Entrées populaires