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

  • 相关阅读:
    Java for LeetCode 229 Majority Element II
    Java for LeetCode 228 Summary Ranges
    Java for LeetCode 227 Basic Calculator II
    Java for LintCode 颜色分类
    Java for LintCode 链表插入排序
    Java for LintCode 颠倒整数
    Java for LintCode 验证二叉查找树
    Java for LeetCode 226 Invert Binary Tree
    Java for LeetCode 225 Implement Stack using Queues
    Java for LeetCode 224 Basic Calculator
  • 原文地址:https://www.cnblogs.com/liqw/p/4267461.html
Copyright © 2011-2022 走看看