Android 生成和Pull解析xml

一、单个对象生成xml

生成以下xml,该怎么生成呢?



  1
  123456
  传说之美
  2015-02-02 11:50:42

先定义一个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_第1张图片

二、解析单个对象组成的xml为单个对象

把生成的xmlparser_account.xml文件放在res/xml/下,将这个xml解析为Account对象。这里用XmlResourceParser,XmlResourceParser继承了xmlpullparse的类。

Pull解析和sax解析类似,都采用事件驱动进行解析的,当pull解析器,开始解析后,调用它的next()方法,获取下一个解析事件(包括4个解析事件:开始文档,结束文档,开始标签,结束标签),这里单单说一下Pull解析。

	/**
	 * 解析单个对象组成的xml和xml组
	 * @return
	 */
	private List getListData() {
		List accountList = new ArrayList();
		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组

类似这样



  
    2
    123456
    传说
    2015-02-02 02:54:41
  
  
    3
    567890
    之美
    2015-02-02 02:54:41
  

生成单个对象组 组成的xml组跟单个对象xml基本差不多,写成了一个方法,把生成的xml保存在xmlparser_accounts.xml文件。

	/**
	 * 生成单个对象的xml数组
	 * 
	 * @param data
	 */
	private static void XmlFileCreator(List 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 accountList = new ArrayList();
		accountList.add(account1);
		accountList.add(account2);
		XmlFileCreator(accountList);

生成的文件如下

Android 生成和Pull解析xml_第2张图片

四、解析单个对象组成的xml组

二、解析单个对象组成的xml为单个对象 一样 ,请查看二

五、生成具有attribute的单个对象组成的xml组

类似如下,account里面还包含一个attribute值如何生成,其实很简单,在 三、单个对象组成的xml组 基础上修改一点就可以了



  
    123456
    传说
    2015-02-02 04:50:45
  
  
    567890
    之美
    2015-02-02 04:50:45
  

修改地方为

			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)