首页 > 代码库 > Android 生成和PULL解析xml

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数据到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的类。

	/**	 * 解析单个对象组成的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

Android 生成和PULL解析xml