zoukankan      html  css  js  c++  java
  • 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 + "]
    
    ";
        }
    }
    

    定义好这个类,就可以利用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);
    						}
    					}
    				}
    

    本文原创链接:http://www.cnblogs.com/liqw/p/4267461.html

    下载地址:http://download.csdn.net/detail/lqw770737185/8417583

  • 相关阅读:
    第十二章 圆周率的计算问题分析
    第十一章:random库概述
    【模板】分治 FFT
    [PKUWC2018]Slay the Spire
    [PKUWC2018]随机算法
    [PKUWC2018]Minimax
    线段树合并初探
    平衡树初探
    Luogu P1613 跑路 题解报告
    CH138 兔子和兔子 题解报告
  • 原文地址:https://www.cnblogs.com/liqw/p/4267461.html
Copyright © 2011-2022 走看看