一、单个对象生成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

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. [原创]Android(安卓)ndkr8编译 FFmpeg 0.11.1 "Happiness"
  6. android2.3编译的两个问题
  7. QT for Android项目开发微信分享功能时,出现错误: android.content
  8. SetContentView 到底Set去哪里呢?
  9. android的软盘影响背景问题

随机推荐

  1. Android(安卓)VR Player(全景视频播放器) [
  2. Android下的微博(新浪)-->第一步获取未授权
  3. 封闭与开放?乔布斯对Android的口水战
  4. Android(安卓)11 第二个开发者预览版发布
  5. Android下的一种编程框架
  6. android:自定义圆环形百分比控件,代码简单,
  7. Android(安卓)3.0七大特性全解析
  8. Android(安卓)4.3实现类似iOS在音乐播放
  9. 从Java到android:类的加载机制
  10. Android中如何实现下拉导航选择菜单效果