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);

查看保存的文件

Android 生成和Pull解析xml

二、解析单个对象组成的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如下

Android 生成和Pull解析xml 

三、单个对象组成的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);

生成的文件如下

Android 生成和Pull解析xml

四、解析单个对象组成的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)