一、單個對象生成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); } } }