android学习之路6:xml数据解析的三种方式
2012-02-22 09:01
579 查看
好久没有写博客了,一方面大米没有时间,另一方面大米一直在潜心研究android,想等技术略有小成的时候在跟大家分享我学到的点滴,这篇博客介绍一下andorid解析读取xml数据格式的三种方式,并附上我的demo(文章最下面)。
xml网络数据传递的一种重要数据载体格式,android手机设备是移动的手机终端,所以对开发android应用来讲,xml数据解析是必须掌握的技术之一。一般有三种解析xml的方式,分别是:
1,DOM
2,SAX
3,PULL
首先看下demo界面:
点击三种解析方式的按钮,出现如下的log输出:
要解析的xml数据,NewFile:
对应的解析后的类,Person.java:
1,DOM解析
2,SAX解析
3,PULL解析
DEMO下载
xml网络数据传递的一种重要数据载体格式,android手机设备是移动的手机终端,所以对开发android应用来讲,xml数据解析是必须掌握的技术之一。一般有三种解析xml的方式,分别是:
1,DOM
2,SAX
3,PULL
首先看下demo界面:
点击三种解析方式的按钮,出现如下的log输出:
要解析的xml数据,NewFile:
<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="23"> <name>大米</name> <age>26</age> </person> <person id="22"> <name>小米</name> <age>25</age> </person> </persons>
对应的解析后的类,Person.java:
package com.leequer.Doem; public class Person { private String id ; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } private String name ; private String age; @Override public String toString() { return this.id+",名字: "+this.name+" 年龄: "+this.age+"\n"; } }
1,DOM解析
public static List<Person> ReadXmlByDom ( InputStream inputStream){ List<Person> rivers=new ArrayList<Person>(); DocumentBuilderFactory factory=null; DocumentBuilder builder=null; Document document=null; //首先找到xml文件 factory=DocumentBuilderFactory.newInstance(); try { //找到xml,并加载文档 builder=factory.newDocumentBuilder(); document=builder.parse(inputStream); //找到根Element Element root=document.getDocumentElement(); NodeList nodes=root.getElementsByTagName("person"); //遍历根节点所有子节点,persons 下所有person Person person=null; for(int i=0;i<nodes.getLength();i++){ person=new Person(); //获取river元素节点 Element personElement=(Element)(nodes.item(i)); //获取river中id属性值 person.setId(personElement.getAttribute("id")); //获取river下name和age标签(即node 节点) Element name=(Element)personElement.getElementsByTagName("name").item(0); person.setName(name.getFirstChild().getNodeValue()); Element age=(Element)personElement.getElementsByTagName("age").item(0); person.setAge(age.getFirstChild().getNodeValue()); rivers.add(person); } }catch (IOException e){ e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); }finally{ try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } return rivers; }
2,SAX解析
public class ReadXmlBySaxService extends DefaultHandler { public ArrayList <Person> personList = null; Person person; String tag; //当遇到文档就触发 public void startDocument() throws SAXException { Log.e("info", "begin"); personList =new ArrayList<Person>(); } //读取文档结束触发 public void endDocument() throws SAXException { Log.e("info", "end"); } //当遇到开始标签的时候就会触发这个方法 public void startElement(String namespaceURI, String localName, String qName, Attributes attr) throws SAXException { if (localName.equals("person")) { person = new Person(); //节点第一个属性值 person.setId(attr.getValue(0)); } tag = localName; } public void endElement(String namespaceURI, String localName, String qName) throws SAXException { if (localName.equals("person")) { //获取标签的全部属性 personList.add(person); person = null; } tag=null; } public void characters(char[] ch, int start, int length) throws SAXException { if(tag!=null){ String data = new String(ch, start, length);//获取文本节点的数据 if("name".equals(tag)){ person.setName(data); }else if("age".equals(tag)){ person.setAge(data); } } } }
3,PULL解析
public static List<Person> ReadXmlByPull (InputStream inputStream)throws Exception { List <Person> personList = null; /** * android给我们提供了xml 用来得到xmlpull解析器 */ XmlPullParser xmlpull = Xml.newPullParser(); /** * 将输入流传入 设定编码方式 * */ xmlpull.setInput(inputStream, "utf-8"); /** * pull读到xml后 返回数字 * * 读取到xml的声明返回数字0 START_DOCUMENT; 读取到xml的结束返回数字1 END_DOCUMENT ; 读取到xml的开始标签返回数字2 START_TAG 读取到xml的结束标签返回数字3 END_TAG 读取到xml的文本返回数字4 TEXT */ int eventCode = xmlpull.getEventType(); /** * 只要这个事件返回的不是1 我们就一直读取xml文件 */ Person person = null; while(eventCode!=XmlPullParser.END_DOCUMENT) { switch (eventCode) { case XmlPullParser.START_DOCUMENT: {//开始文档 new数组 personList =new ArrayList<Person>(); break; } case XmlPullParser.START_TAG: { if("person".equals(xmlpull.getName())) { person = new Person(); //节点第一个属性值 person.setId(xmlpull.getAttributeValue(0)); }else if (person!=null) { if(("name".equals(xmlpull.getName()))) { /** * 如果当前元素的下一个元素是文本节点 就可以直接用nextText()这个方法来得到文本节点的内容 */ person.setName(xmlpull.nextText()); }else if ("age".equals(xmlpull.getName())) { /** * 如果当前元素的下一个元素是文本节点 就可以直接用nextText()这个方法来得到文本节点的内容 */ person.setAge(xmlpull.nextText()); } } break; } case XmlPullParser.END_TAG: { if("person".equals(xmlpull.getName())&&person!=null) { personList.add(person); person = null; } break; } } eventCode = xmlpull.next();//没有结束xml文件就推到下个进行解析 } return personList; }
DEMO下载
相关文章推荐
- UI网络笔记(四):UI网络之解析XML数据的三种方式
- 4.1 解析 XML 数据的三种方式详解
- Android XML数据的三种解析方式
- Android学习之XML数据的三种解析方式以及生成XML文件
- Android基础——XML数据的三种解析方式
- XML数据的三种解析(JSON方式 , DOM方式 , Sax方式)
- Android基础——XML数据的三种解析方式
- Android基础——XML数据的三种解析方式
- Android基础—XML数据解析的三种方式
- Xml数据解析的三种方式
- XML数据的三种解析方式
- android解析xml 三种方式
- android解析xml三种方式学习总结
- Android第一行代码 第九章 数据解析方式(xml,json)
- 详解android解析Xml的三种方式——DOM、SAX以及XMLpull
- android 解析服务器数据使用json还是xml方式
- android解析XML总结-SAX、Pull、Dom三种方式
- Android三种方式解析Xml
- java解析xml数据的四种方式
- xml解析得到数据并将其插入数据库(dom4j非Xpath方式)