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的类。

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","can't create FileOutputStream");
		}
		XmlSerializer serializer = Xml.newSerializer();
		try {
			serializer.setOutput(fileos,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","传说",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,"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

相关文章

文章浏览阅读8.8k次,点赞9次,收藏20次。本文操作环境:win1...
文章浏览阅读1.2w次,点赞15次,收藏69次。实现目的:由main...
文章浏览阅读3.8w次。前言:最近在找Android上的全局代理软件...
文章浏览阅读2.5w次,点赞17次,收藏6次。创建项目后,运行项...
文章浏览阅读8.9w次,点赞4次,收藏43次。前言:在Android上...
文章浏览阅读1.1w次,点赞4次,收藏17次。Android Studio提供...