• Android 操作XML的几种方式


    最近在学习Android的开发知识。今天在看传智博客黎老师的视频刚好看到了关于xml文件操作的知识,自己在之前的学习使用中基本都是使用DOM的方式操作XML的文件,今天知道了其他的方式总结记录下来方便后面自己使用。

    Android里面操作xml文件主要有三种方式:

    SAX方式,DOM方式,PULL方式。据说因为DOM的方式比较耗内存,而手机最纠结的就是存储空间小的问题,所以在Android里面不提倡使用DOM的方式。而SAX方式和PULL方式的思想比较的相似,原理似乎是同出一则的,实现的思想好像是读取字符串的每一个单词一样,每读取一段就判断读取的是什么内容然后执行相应的方法,直至文件的结尾。

    xml文件内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <persons>
    <person id="30">
    <name>liming</name>
    <age>30</age>
    </person>

    <person id="23">
    <name>limei</name>
    <age>20</age>
    </person>

    </persons>

    下面是三种方式读取xml文件内容的方式:

    SAX实现xml文件内容的读取:

    View Code
    package cn.edu.gxnu.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.edu.gxnu.Domian.Person;

    public class SAXPersonService {

    /**
    * SAX方式获取XML文件的内容
    *
    @param inStream
    *
    @return
    *
    @throws Throwable
    */
    public List<Person> getPersons(InputStream inStream) throws Throwable{
    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser parser = factory.newSAXParser();
    PersonParser personparser = new PersonParser();
    parser.parse(inStream, personparser);
    inStream.close();
    return personparser.getPersons();
    }

    /**
    *
    *
    @author wmh
    *
    */
    private final class PersonParser extends DefaultHandler {

    private List<Person> persons = null;
    private Person person = null;
    private String tag = null;

    public List<Person> getPersons() {
    return persons;
    }

    /**
    * 读取XML至文件开始时方法
    */
    @Override
    public void startDocument() throws SAXException {
    persons = new ArrayList<Person>();
    }

    /**
    * 读取XML的元素节点的方法
    */
    @Override
    public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {
    if("person".equals(localName)){
    person = new Person();
    person.setId(new Integer(attributes.getValue(0)));
    }
    tag = localName;
    }

    /**
    * 读取XML的文本内容时的方法
    */
    @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 Short(data));
    }
    }
    }

    /**
    * 读取到元素节点结束时的方法
    */
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {

    if("person".equals(localName)){
    persons.add(person);
    person = null;
    }

    tag = null;
    }

    }

    }

    DOM实现xml文件内容的读取:

    View Code
    package cn.edu.gxnu.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.edu.gxnu.Domian.Person;

    public class DOMPersonService {

    /**
    * 使用DOM获取XML文件的内容
    *
    @param inStream
    *
    @return
    *
    @throws Throwable
    */
    public List<Person> getPersons(InputStream inStream) throws Throwable{
    List<Person> persons = new ArrayList<Person>();
    //DOM文件创建工厂
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    //DOM创建对象
    DocumentBuilder builder = factory.newDocumentBuilder();
    //获取XML的DOM
    Document document = builder.parse(inStream);
    //获取XML文件的内容
    Element root = document.getDocumentElement();
    //获取XML文件的节点
    NodeList personNode = root.getElementsByTagName("person");
    for(int i = 0 ; i < personNode.getLength() ; i++){
    Person person = new Person();
    Element personElemt = (Element)personNode.item(i);
    person.setId(new Integer(personElemt.getAttribute("id")));
    //获取当前节点的字节点
    NodeList personChildNode = personElemt.getChildNodes();
    for(int y = 0 ; y < personChildNode.getLength() ; y++){
    if(personChildNode.item(y).getNodeType() == Node.ELEMENT_NODE){
    Element childElent = (Element)personChildNode.item(y);
    if("name".equals(childElent.getNodeName())){
    person.setName(childElent.getFirstChild().getNodeValue());
    }else if("age".equals(childElent.getNodeName())){
    person.setAge(new Short(childElent.getFirstChild().getNodeValue()));
    }
    }
    }
    persons.add(person);
    }
    return persons;
    }

    }

    PULL实现xml文件内容的读取:

    View Code
    package cn.edu.gxnu.Service;

    import java.io.InputStream;
    import java.io.OutputStream;
    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.edu.gxnu.Domian.Person;

    public class PULLPersonService {

    /**
    * PULL方式获取XML文件内容
    *
    @param inStream
    *
    @return
    *
    @throws Throwable
    */
    public List<Person> getPersons(InputStream inStream) throws Throwable{
    List<Person> persons = null;
    Person person = null;
    XmlPullParser parser = Xml.newPullParser();
    parser.setInput(inStream, "UTF-8");
    int eventType = parser.getEventType();
    while(eventType != XmlPullParser.END_DOCUMENT){//判断文件是否是文件的结尾,END_DOCUMENT文件结尾常量
    switch(eventType){
    case XmlPullParser.START_DOCUMENT://文件开始,START_DOCUMENT文件开始开始常量
    persons = new ArrayList<Person>();
    break;

    case XmlPullParser.START_TAG://元素标签开始,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 Short(parser.nextText()));
    }
    }
    break;

    case XmlPullParser.END_TAG://元素标签结束,END_TAG结束常量
    if("person".equals(parser.getName())){
    persons.add(person);
    person = null;
    }
    break;
    }
    //获取当前元素标签的类型
    eventType = parser.getEventType();
    }
    return persons;
    }
    }

    而构造XML的方式页比较好理解,PULL的方式提供了构造文件,节点开始和结束的方法,只需要调用特定的方法传入特定的内容即可完成XML文件的构造

    View Code
    package cn.edu.gxnu.Service;

    import java.io.InputStream;
    import java.io.OutputStream;
    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.edu.gxnu.Domian.Person;

    public class PULLPersonService {

    /**
    * OputStram方式生成XML文件
    *
    @param persons
    *
    @param outStream
    *
    @throws Throwable
    */
    public static void save(List<Person> persons , OutputStream outStream) throws Throwable{
    XmlSerializer serializer = Xml.newSerializer();
    serializer.setOutput(outStream, "UTF-8");
    serializer.startDocument("UTF-8", true);

    serializer.startTag(null, "persons");
    for(Person person : persons){
    serializer.startTag(null, "person");
    serializer.attribute(null, "id", person.getId().toString());

    serializer.startTag(null, "name");
    serializer.text(person.getName());
    serializer.endTag(null, "name");

    serializer.startTag(null, "age");
    serializer.text(person.getAge().toString());
    serializer.endTag(null, "age");

    serializer.endTag(null, "person");
    }
    serializer.endTag(null, "persons");
    serializer.endDocument();
    outStream.flush();
    outStream.close();
    }
    }

    这样,就可以构造一个XML文件了,每个节点都是一对一对的出现的。

  • 相关阅读:
    android 选择图片 剪裁 拍照 兼容所有版本的代码
    bitmap_createScaledBitmap的方法
    ViewPager的滑动监听事件
    android效果背景虚化
    Python socket超时
    Python 半开放socket
    Python绑定方法,未绑定方法,类方法,实例方法,静态方法
    Python类属性,实例属性
    Python偏函数
    Python filter,map,lambda,reduce,列表解析
  • 原文地址:https://www.cnblogs.com/116913829/p/2316665.html
Copyright © 2020-2023  润新知