Android中解析与创建XML文件

来源:互联网 发布:淘宝里高档租婚纱的店 编辑:程序博客网 时间:2024/06/06 05:25

Android中解析与创建XML文件

在Android中对XML的操作有多种方式,常见的有三种方式:SAX、DOM和PULL方式。
DOM方式会把整个XML文件加载到内存中,在PC上常使用DOM的方式。
但是在性能敏感的设备上,主要采用的是SAX的方式,但是缺点是嵌套多个分支的时候处理不是很方便。
而PULL的方式类似SAX方式,同样很节省内存。
因此,本文章中只提供PULL的方式解析与创建XML文件。

基础类

本例中使用的实体类的定义如下:

public class CAddress implements Serializable {    /** IP地址 */    private String ip;    /** 端口 */    private int port;    /** 地址来源:本地添加或者网络推送 */    private String source;    /** 说明:公司内网地址或者外网 **/    private String description;    /** 服务器地址隶书公司名称 */    private String companyName;    public String getIp() {        return ip;    }    public void setIp(String ip) {        this.ip = ip;    }    public int getPort() {        return port;    }    public void setPort(int port) {        this.port = port;    }    public String getSource() {        return source;    }    public void setSource(String source) {        this.source = source;    }    public String getDescription() {        return description;    }    public void setDescription(String description) {        this.description = description;    }    public String getCompanyName() {        return companyName;    }    public void setCompanyName(String companyName) {        this.companyName = companyName;    }    private static final long serialVersionUID = 1L;    public CAddress() {    }}

XML的创建DEMO

构建数据

首先构建一个数据结构,即XML的数据来源,代码如下:

package com.keyisoftware.toperaxml;import java.io.IOException;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.os.Bundle;/** *  * @author daqin * */public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        try {            CAddress.write(getAddressList());        } catch (IllegalArgumentException e) {            e.printStackTrace();        } catch (IllegalStateException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }    /***     * 构建数据     * @return     */    public static List<CAddress> getAddressList() {        List<CAddress> addresses = new ArrayList<CAddress>();        CAddress address = null;        address = new CAddress();        address.setIp("192.168.1.234");        address.setPort(443);        address.setDescription("说明:内网地址");        address.setSource("来源:网络推送");        address.setCompanyName("可依软件有限责任公司");        addresses.add(address);        address = new CAddress();        address.setIp("221.237.152.95");        address.setPort(443);        address.setDescription("说明:外网地址");        address.setSource("来源:本地添加");        address.setCompanyName("可依调研有限责任公司");        addresses.add(address);        address = new CAddress();        address.setIp("192.168.1.105");        address.setPort(443);        address.setDescription("说明:内网测试");        address.setSource("来源:本地添加");        address.setCompanyName("可依餐饮有限责任公司");        addresses.add(address);        address = new CAddress();        address.setIp("221.237.152.95");        address.setPort(8443);        address.setDescription("说明:外网地址");        address.setSource("来源:本地添加");        address.setCompanyName("可依生物制药股份有限公司");        addresses.add(address);        address = new CAddress();        address.setIp("192.168.199.225");        address.setPort(443);        address.setDescription("说明:内网地址");        address.setSource("来源:网络推送");        address.setCompanyName("大秦集团");        addresses.add(address);        return addresses;    }}
创建XML文件的关键方法

一般定义在实体类中,或者定义在逻辑层中,具体代码如下:

public static boolean write(List<CAddress> addresses) throws IllegalArgumentException, IllegalStateException, IOException {        File file = new File("/sdcard/address.xml");        XmlSerializer serializer = Xml.newSerializer();        FileOutputStream fos = null;        // 根据文件对象创建一个文件的输出流对象        fos = new FileOutputStream(file);        // 设置输出的流及编码        serializer.setOutput(fos, "UTF-8");        // 设置XML的编码格式以及是否独立关联,true默认独立不关联,false反之;        serializer.startDocument("UTF-8", true);        // 设置缩进选项        serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);        // 根标签开始        serializer.startTag(null, "Addresses");        for (CAddress cAddress : addresses) {            // 子标签的开始            serializer.startTag(null, "address");            // 设置子标签的属性            serializer.attribute(null, "company", cAddress.getCompanyName());            // 设置子标签的子标签,可以无限递归循环下去            serializer.startTag(null, "description");            serializer.text(cAddress.getDescription());            serializer.endTag(null, "description");            serializer.startTag(null, "source");            serializer.text(cAddress.getSource());            serializer.endTag(null, "source");            serializer.startTag(null, "IP");            serializer.text(cAddress.getIp());            serializer.endTag(null, "IP");            serializer.startTag(null, "Port");            serializer.text("" + cAddress.getPort());            serializer.endTag(null, "Port");            serializer.endTag(null, "address");        }        serializer.endTag(null, "Addresses");        serializer.endDocument();        fos.flush();        fos.close();        return true;    }
创建的XML文件的结果如下
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><Addresses>  <address company="可依软件有限责任公司">    <description>说明:内网地址</description>    <source>来源:网络推送</source>    <IP>192.168.1.234</IP>    <Port>443</Port>  </address>  <address company="可依调研有限责任公司">    <description>说明:外网地址</description>    <source>来源:本地添加</source>    <IP>221.237.152.95</IP>    <Port>443</Port>  </address>  <address company="可依餐饮有限责任公司">    <description>说明:内网测试</description>    <source>来源:本地添加</source>    <IP>192.168.1.105</IP>    <Port>443</Port>  </address>  <address company="可依生物制药股份有限公司">    <description>说明:外网地址</description>    <source>来源:本地添加</source>    <IP>221.237.152.95</IP>    <Port>8443</Port>  </address>  <address company="大秦集团">    <description>说明:内网地址</description>    <source>来源:网络推送</source>    <IP>192.168.199.225</IP>    <Port>443</Port>  </address></Addresses>

XML的解析DEMO

实现解析的功能函数
public static List<CAddress> parse(InputStream inputStream) {        List<CAddress> addresses = null;        CAddress address = null;        XmlPullParser xmlParser = Xml.newPullParser();        try {            xmlParser.setInput(inputStream, "utf-8");            int envType = xmlParser.getEventType();            while (envType != XmlPullParser.END_DOCUMENT) {                String tag = xmlParser.getName();                switch (envType) {                case XmlPullParser.START_TAG:                    if (tag.equalsIgnoreCase("Addresses")) {                        addresses = new ArrayList<CAddress>();                    } else if (tag.equalsIgnoreCase("Address")) {                        address = new CAddress();                        address.setCompanyName(xmlParser.getAttributeValue(null, "company"));                    } else {                        if (address != null) {                            if (tag.equalsIgnoreCase("description")) {                                address.setDescription(xmlParser.nextText());                            }                            if (tag.equalsIgnoreCase("source")) {                                address.setSource(xmlParser.nextText());                            }                            if (tag.equalsIgnoreCase("IP")) {                                address.setIp(xmlParser.nextText());                            }                            if (tag.equalsIgnoreCase("Port")) {                                String port = xmlParser.nextText();                                address.setPort(Integer.parseInt(port));                            }                        }                    }                    break;                case XmlPullParser.END_TAG:                    if (tag.equalsIgnoreCase("Address")) {                        addresses.add(address);                        address = null;                    }                    break;                default:                    break;                }                envType = xmlParser.next();            }        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                inputStream.close();            } catch (IOException e) {                e.printStackTrace();            }        }        return addresses;    }
调用代码如下
File file = new File("/sdcard/address.xml");        try {            FileInputStream inputStream = new FileInputStream(file);            List<CAddress> addresses = CAddress.parse(inputStream);            System.out.println("CAddress:" + addresses.size());        } catch (FileNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }
0 0
原创粉丝点击