一、单个对象生成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数据到FileOutputStream serializer.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); } } }