Android(安卓)生成和Pull解析xml
一、单个对象生成xml
生成以下xml,该怎么生成呢?
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><account> <id>1</id> <password>123456</password> <name>传说之美</name> <createDate>2015-02-02 11:50:42</createDate></account>
先定义一个account类,属性有id、name、password、createDate。
public class Account { private String id; private String password; private String name; private String createDate; public Account() { super(); } public Account(String id, String password, String name, String createDate) { super(); this.id = id; this.password = password; this.name = name; this.createDate = createDate; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCreateDate() { return createDate; } public void setCreateDate(String createDate) { this.createDate = createDate; } @Override public String toString() { return "Account [id=" + id + ", password=" + password + ", name=" + name + ", createDate=" + createDate + "]\n\n"; }}
定义好这个类,就可以利用XmlSerializer用于写xml数据了。写个方法,把生成的xml保存在xmlparser_account.xml文件。
/** * 单个对象生成xml * @param account */private static void XmlFileCreator(Account account) {File newxmlfile = new File(Environment.getExternalStorageDirectory() + "/xmlparser_account.xml");try {if (!newxmlfile.exists())newxmlfile.createNewFile();} catch (IOException e) {Log.e("IOException", "exception in createNewFile() method");}FileOutputStream fileos = null;try {fileos = new FileOutputStream(newxmlfile);} catch (FileNotFoundException e) {Log.e("FileNotFoundException", "can't create FileOutputStream");}// XmlSerializer用于写xml数据XmlSerializer serializer = Xml.newSerializer();try {// XmlSerializer 用 UTF-8 编码serializer.setOutput(fileos, "UTF-8");serializer.startDocument(null, Boolean.valueOf(true));serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);serializer.startTag(null, "account");// xml-tree,由startTag开始,endTag结束serializer.startTag(null, "id");serializer.text(account.getId());serializer.endTag(null, "id");serializer.startTag(null, "password");serializer.text(account.getPassword());serializer.endTag(null, "password");serializer.startTag(null, "name");serializer.text(account.getName());serializer.endTag(null, "name");serializer.startTag(null, "createDate");serializer.text(account.getCreateDate());serializer.endTag(null, "createDate");serializer.endTag(null, "account");serializer.endDocument();// 写xml数据到FileOutputStreamserializer.flush();// 关闭fileos,释放资源fileos.close();} catch (Exception e) {Log.e("Exception", "error occurred while creating xml file");}}
生成account对象,单个对象生成xml
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");Account account = new Account("1", "123456", "传说之美", sdf.format(new Date()));XmlFileCreator(account);
查看保存的文件
二、解析单个对象组成的xml为单个对象
把生成的xmlparser_account.xml文件放在res/xml/下,将这个xml解析为Account对象。这里用XmlResourceParser,XmlResourceParser继承了xmlpullparse的类。
Pull解析和sax解析类似,都采用事件驱动进行解析的,当pull解析器,开始解析后,调用它的next()方法,获取下一个解析事件(包括4个解析事件:开始文档,结束文档,开始标签,结束标签),这里单单说一下Pull解析。
/** * 解析单个对象组成的xml和xml组 * @return */private List<Account> getListData() {List<Account> accountList = new ArrayList<Account>();XmlResourceParser xrp = getResources().getXml(R.xml.xmlparser_account);try {// 直到文档的结尾处Account account = null;while (xrp.getEventType() != XmlResourceParser.END_DOCUMENT) {String tagName = xrp.getName();if (xrp.getEventType() == XmlResourceParser.START_DOCUMENT){}// 如果遇到了开始标签if (xrp.getEventType() == XmlResourceParser.START_TAG) {Log.i("", tagName);if(tagName.equals("account")){account = new Account();} else if (account != null) {if (tagName.equals("id")) {String id = xrp.nextText();// 通过属性名来获取属性值account.setId(id);} else if (tagName.equals("password")) {String password = xrp.nextText();// 通过属性索引来获取属性值account.setPassword(password);} else if (tagName.equals("name")) {String name = xrp.nextText();account.setName(name);} else if (tagName.equals("createDate")) {String createDate = xrp.nextText();account.setCreateDate(createDate);}}}if (xrp.getEventType() == XmlResourceParser.END_TAG) {if (tagName.equals("account") && account !=null) {accountList.add(account);account = null;}}xrp.next();// 获取解析下一个事件}} catch (XmlPullParserException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return accountList;}
直接打印结果看看
Log.i("", getListData().toString());
log如下
三、单个对象组成的xml组
类似这样
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><accounts> <account> <id>2</id> <password>123456</password> <name>传说</name> <createDate>2015-02-02 02:54:41</createDate> </account> <account> <id>3</id> <password>567890</password> <name>之美</name> <createDate>2015-02-02 02:54:41</createDate> </account></accounts>
生成单个对象组 组成的xml组跟单个对象xml基本差不多,写成了一个方法,把生成的xml保存在xmlparser_accounts.xml文件。
/** * 生成单个对象的xml数组 * * @param data */private static void XmlFileCreator(List<Account> data) {File newxmlfile = new File(Environment.getExternalStorageDirectory() + "/xmlparser_accounts.xml");try {if (!newxmlfile.exists())newxmlfile.createNewFile();} catch (IOException e) {Log.e("IOException", "exception in createNewFile() method");}FileOutputStream fileos = null;try {fileos = new FileOutputStream(newxmlfile);} catch (FileNotFoundException e) {Log.e("FileNotFoundException", "can't create FileOutputStream");}XmlSerializer serializer = Xml.newSerializer();try {serializer.setOutput(fileos, "UTF-8");serializer.startDocument(null, Boolean.valueOf(true));serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);serializer.startTag(null, "accounts");for (Account account : data) {serializer.startTag(null, "account");serializer.startTag(null, "id");serializer.text(account.getId());serializer.endTag(null, "id");serializer.startTag(null, "password");serializer.text(account.getPassword());serializer.endTag(null, "password");serializer.startTag(null, "name");serializer.text(account.getName());serializer.endTag(null, "name");serializer.startTag(null, "createDate");serializer.text(account.getCreateDate());serializer.endTag(null, "createDate");serializer.endTag(null, "account");}serializer.endTag(null, "accounts");serializer.endDocument();serializer.flush();fileos.close();} catch (Exception e) {Log.e("Exception", "error occurred while creating xml file");}}
简单地用几行代码生成
Account account1 = new Account("2", "123456", "传说", sdf.format(new Date()));Account account2 = new Account("3", "567890", "之美", sdf.format(new Date()));List<Account> accountList = new ArrayList<Account>();accountList.add(account1);accountList.add(account2);XmlFileCreator(accountList);
生成的文件如下
四、解析单个对象组成的xml组
跟 二、解析单个对象组成的xml为单个对象一样 ,请查看二
五、生成具有attribute的单个对象组成的xml组
类似如下,account里面还包含一个attribute值如何生成,其实很简单,在三、单个对象组成的xml组 基础上修改一点就可以了
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><accounts> <account id="2"> <password>123456</password> <name>传说</name> <createDate>2015-02-02 04:50:45</createDate> </account> <account id="3"> <password>567890</password> <name>之美</name> <createDate>2015-02-02 04:50:45</createDate> </account></accounts>
修改地方为
for (Account account : data) {serializer.startTag(null, "account");serializer.attribute(null, "id", account.getId());//serializer.startTag(null, "id");//serializer.text(account.getId());//serializer.endTag(null, "id");serializer.startTag(null, "password");serializer.text(account.getPassword());serializer.endTag(null, "password");serializer.startTag(null, "name");serializer.text(account.getName());serializer.endTag(null, "name");serializer.startTag(null, "createDate");serializer.text(account.getCreateDate());serializer.endTag(null, "createDate");serializer.endTag(null, "account");}
六、解析具有attribute的单个对象组成的xml组
解析同理,跟四、解析单个对象组成的xml组差不多,修改id部分解析即可
// 如果遇到了开始标签if (xrp.getEventType() == XmlResourceParser.START_TAG) {Log.i("", tagName);if(tagName.equals("account")){account = new Account();String id = xrp.getAttributeValue(null, "id");account.setId(id);} else if (account != null) {if (tagName.equals("id")) {//String id = xrp.nextText();//account.setId(id);} else if (tagName.equals("password")) {String password = xrp.nextText();account.setPassword(password);} else if (tagName.equals("name")) {String name = xrp.nextText();account.setName(name);} else if (tagName.equals("createDate")) {String createDate = xrp.nextText();account.setCreateDate(createDate);}}}
本文原创链接:http://www.cnblogs.com/liqw/p/4267461.html
下载地址:http://download.csdn.net/detail/lqw770737185/8417583
更多相关文章
- 一款常用的 Squid 日志分析工具
- GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
- RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
- Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
- [原创]Android(安卓)ndkr8编译 FFmpeg 0.11.1 "Happiness"
- android2.3编译的两个问题
- QT for Android项目开发微信分享功能时,出现错误: android.content
- SetContentView 到底Set去哪里呢?
- android的软盘影响背景问题