Extensible Markup Language (XML) 是一组将文档编码成机器可读形式的规则,也是一种在网络上共享数据的普遍格式。经常更新内容的网站比如新闻网站和博客上都提供XML Feed来记录更新的信息,以便用户进行订阅读取。
解析器我们用XMLPullParser ,Android 官网推荐。如果对xml不熟悉可以先看下http://www.w3cschool.cc/xml/xml-tutorial.html;
今天写的demo是基于上次的AsyncTask之下载HTML的扩充 ,首先我写了一个persons.xml
<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="1"> <name>Tom</name> <age>21</age> </person> <person id="2"> <name>Rose</name> <age>22</age> </person> <person id="3"> <name>Jack</name> <age>20</age> </person> </persons>
之后我把它上传到了七牛云存储,地址http://carousel.qiniudn.com/persons.xml,可以直接点击查看,下载。
接下来在工程下写一个Person JavaBean:
public class Person { public String getName() { return name; } public void setName(String name) { this.name = name; } public Short getAge() { return age; } public void setAge(Short age) { this.age = age; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } private Integer id; private String name; private Short age; }
在MainActivity加入 readXML():
public List<Person> readXML(InputStream inStream) { // Log.i("LIST","startReadXML"); //创建解析器对象,生成实例 XmlPullParser parser = Xml.newPullParser(); try { parser.setInput(inStream,"UTF-8");// 设置数据源编码 int eventType = parser.getEventType();// 获取事件类型 Person currentPerson = null; List<Person> persons = null; while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_DOCUMENT:// 文档开始事件,可以进行数据初始化处理 persons = new ArrayList<Person>();// 实例化集合类 break; case XmlPullParser.START_TAG:// 开始读取某个标签 // 通过getName判断读到哪个标签,然后通过nextText()获取文本节点值,或通过getAttributeValue(i)获取属性节点值 String name = parser.getName(); if (name.equalsIgnoreCase("person")) { currentPerson = new Person(); currentPerson.setId(new Integer(parser .getAttributeValue(null,"id"))); } else if (currentPerson != null) { if (name.equalsIgnoreCase("name")) { currentPerson.setName(parser.nextText());// 如果后面是Text元素,即返回它的值 Log.i("LIST",currentPerson.getName()); } else if (name.equalsIgnoreCase("age")) { currentPerson.setAge(new Short(parser.nextText())); } } break; case XmlPullParser.END_TAG:// 结束元素事件 // 读完一个Person,可以将其添加到集合类中 if (parser.getName().equalsIgnoreCase("person") && currentPerson != null) { persons.add(currentPerson); currentPerson = null; } break; } eventType = parser.next(); } inStream.close(); return persons; } catch (Exception e) { e.printStackTrace(); } return null; }
对于上次的downloadUrL() 末尾一点改动:
//获取InputSream is = conn.getInputStream(); //把InputStream 转为 String // String contentAsString = readIt(is,len); StringBuilder strBuilder = new StringBuilder(); List<Person> list = readXML(is); for (int i = 0; i < list.size(); i++) { strBuilder.append("id:" + list.get(i).getId() + "\n"); strBuilder.append("name:" + list.get(i).getName() + "\n"); strBuilder.append("age:" + list.get(i).getAge() + "\n"); strBuilder.append("==========\n"); } return strBuilder.toString();
原文链接:https://www.f2er.com/xml/297011.html