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
- Android中解析与创建XML文件
- Android 创建与解析xml文件
- Android 创建与解析XML
- Android中xml和json文件的解析和创建
- Android中Sax解析与Dom解析xml文件
- Android中创建与几种解析xml的方法!
- Android 中创建与解析XML的方法
- Android 中创建与解析XML的方法
- Android 中创建与解析XML的方法
- android中解析XML文件
- Android中XML文件解析
- 使用Dom4j创建与解析XML文件
- Android中xml文件解析 SAX方式 与 PULL方式
- Android中XML文件的序列化生成与解析
- Android中XML文件的序列化生成与解析
- Android中XML文件的序列化生成与解析
- Android中XML文件的序列化生成与解析
- Android中XML文件的序列化生成与解析
- 随笔
- 分享个最近在做的自动化测试框架
- JAVA的堆实现: PriorityQueue
- strace 输出长字符串
- GPLT-L1-6. 连续因子
- Android中解析与创建XML文件
- 详解Oracle DELETE和TRUNCATE 的区别
- Hibernate的关联映射之1-N关联映射
- RPC模型和rest的区别
- android设备日常使用问题请评论本日志
- Problem D: 字母变成其下一字母
- hdu 2072 不同单词数
- iPhone、iPad各类问题请评论本bo
- ROS玩AR.drone(-3-)