android下解析xml_第1页
android下解析xml_第2页
android下解析xml_第3页
android下解析xml_第4页
android下解析xml_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android 下解析下解析 xml 的三种方式的三种方式 在 Android 平台上可以使用 Simple API for XML SAX Document Object Model DOM 和 Android 附带的 pull 解析器解析 XML 文件 下面是本例子要解析的 XML 文件 itcast xml 01 02 03 04 李明 05 30 06 07 08 李向梅 09 25 10 11 例子定义了一个 javabean 用于存放上面解析出来的 xml 内容 这个 javabean 为 Person 代码 01 public classPerson 02 03 privateInteger id 04 privateString name 05 privateShort age 06 07 publicInteger getId 08 returnid 09 10 11 public voidsetId Integer id 12 this id id 13 14 15 publicString getName 16 returnname 17 18 19 public voidsetName String name 20 this name name 21 22 23 publicShort getAge 24 returnage 25 26 27 public voidsetAge Short age 28 this age age 29 30 1 SAX 解析 XML 文件 SAX 是一个解析速度快并且占用内存少的 xml 解析器 非常适合用于 Android 等移动 设备 SAX 解析 XML 文件采用的是事件驱动 也就是说 它并不需要解析完整个文档 在按 内容顺序解析文档的过程中 SAX 会判断当前读到的字符是否合法 XML 语法中的某部分 如 果符合就会触发事件 所谓事件 其实就是一些回调 callback 方法 这些方法 事件 定义 在 ContentHandler 接口 01 public staticList readXML InputStream inStream 02 try 03 创建解析器 04 SAXParserFactory spf SAXParserFactory newInstance 05 SAXParser saxParser spf newSAXParser 06 07 设置解析器的相关特性 true 表示开启命名空间特性 08 saxParser setProperty http xml org sax features name spaces true 09 XMLContentHandler handler newXMLContentHandler 10 saxParser parse inStream handler 11 inStream close 12 13 returnhandler getPersons 14 catch Exception e 15 e printStackTrace 16 17 18 returnnull 19 20 21 22 SAX 类 DefaultHandler 它实现了 ContentHandler 接口 在实现的时候 只需要继承该类 重载相应的方法即可 23 public class XMLContentHandler extendsDefaultHandler 24 25 privateList persons null 26 privatePerson currentPerson 27 privateString tagName null 当前解析的元素标签 28 29 publicList getPersons 30 returnpersons 31 32 33 接收文档开始的通知 当遇到文档的开头的时候 调用这个 方法 可以在其中做一些预处理的工作 34 Override 35 public void startDocument throwsSAXException 36 persons newArrayList 37 38 39 接收元素开始的通知 当读到一个开始标签的时候 会触发 这个方法 其中 namespaceURI 表示元素的命名空间 40 localName 表示元素的本地名称 不带前缀 qName 表示元 素的限定名 带前缀 atts 表示元素的属性集合 41 Override 42 public voidstartElement String namespaceURI String localName String qName Attributes atts throwsSAXException 43 44 if localName equals person 45 currentPerson newPerson 4 6 currentPerson setId Integer par seInt atts getValue id 47 48 49 this tagName localName 50 51 52 接收字符数据的通知 该方法用来处理在 XML 文件中读到的 内容 第一个参数用于存放文件的内容 53 后面两个参数是读到的字符串在这个数组中的起始位置和长 度 使用 new String ch start length 就可以获取内容 54 Override 55 public void characters char ch int start int length throwsSAXException 56 57 if tagName null 58 String data newString ch start length 59 if tagName equals name 60 this currentPerson setName data 61 elseif tagName equals age 6 2 this currentPerson setAge Short parseShort data 63 64 65 66 67 接收文档的结尾的通知 在遇到结束标签的时候 调用这个 方法 其中 uri 表示元素的命名空间 68 localName 表示元素的本地名称 不带前缀 name 表示元 素的限定名 带前缀 69 Override 70 public void endElement String uri String localName String name throwsSAXException 71 72 if localName equals person 73 persons add currentPerson 74 currentPerson null 75 76 77 this tagName null 78 79 2 DOM 解析 XML 文件 DOM 解析 XML 文件时 会将 XML 文件的所有内容读取到内存中 然后允许您使用 DOM API 遍历 XML 树 检索所需的数据 使用 DOM 操作 XML 的代码看起来比较直观 并且 在 某些方面比基于 SAX 的实现更加简单 但是 因为 DOM 需要将 XML 文件的所有内容读取到 内存中 所以内存的消耗比较大 特别对于运行 Android 的移动设备来说 因为设备的资源比 较宝贵 所以建议还是采用 SAX 来解析 XML 文件 当然 如果 XML 文件的内容比较小采用 DOM 是可行的 01 public staticList readXML InputStream inStream 02 03 List persons newArrayList 04 05 DocumentBuilderFactory factory DocumentBuilderFactory newInstance 06 07 try 08 DocumentBuilder builder factory newDocumentBuilder 09 Document dom builder parse inStream 10 11 Element root dom getDocumentElement 12 13 NodeList items root getElementsByTagName person 查找所有 person 节点 14 15 for inti 0 i items getLength i 16 Person person newPerson 17 18 得到第一个 person 节点 19 Element personNode Element items item i 20 21 获取 person 节点的 id 属性值 2 2 person setId newInteger personN ode getAttribute id 23 24 获取 person 节点下的所有子节点 标签之间的空白节点和 name age 元素 25 NodeList childsNodes personNode getChildNodes 26 27 for intj 0 j childsNodes getLength j 28 Node node Node childsNodes item j 判断是否为元素类型 29 30 if node getNodeType Node ELEMENT NODE 31 Element childNode Element node 32 33 判 断是否 name 元素 3 4 if nam e equals childNode getNodeName 3 5 获取 name 元素下 Text 节点 然后从 Text 节点获取数据 3 6 person setName childNode getFirstChild getNodeValue elseif age equals childNode getNodeName 3 7 person setAge newShort childNode getFirstChild getNodeValue 38 39 40 41 42 persons add person 43 44 45 inStream close 46 catch Exception e 47 e printStackTrace 48 49 50 returnpersons 51 3 Pull 解析器解析 XML 文件 Pull 解析器的运行方式与 SAX 解析器相似 它提供了类似的事件 如 开始元素和结 束元素事件 使用 parser next 可以进入下一个元素并触发相应事件 事件将作为数值代码 被发送 因此可以使用一个 switch 对感兴趣的事件进行处理 当元素开始解析时 调用 parser nextText 方法可以获取下一个 Text 类型元素的值 001 读取 XML 002 public staticList readXML InputStream inStream 003 004 XmlPullParser parser Xml newPullParser 005 006 try 007 parser setInput inStream UTF 8 008 inteventType parser getEventType 009 010 Person currentPerson null 011 List persons null 012 013 while eventType XmlPullParser END DOCUMENT 014 switch eventType 015 caseXmlPullParser START DOCUME NT 文档开始事件 可以进行数据初始化处理 016 persons newArrayList 017 break 018 019 caseXmlPullParser START TAG 开始元素事件 020 String name parser getName 02 1 if name equalsIgno reCase person 022 curren tPerson newPerson 0 2 3 current Person setId newInteger parser getAttributeValue null id 02 4 else if currentP erson null 02 5 if nam e equalsIgnoreCase name 02 6 currentPerson setName parser nextText 如果后面是 Text 元 素 即返回它的值 02 7 else if name equalsIgnoreCase age 02 8 currentPerson setAge newShort parser nextText 029 030 031 break 032 033 caseXmlPullParser END TAG 结 束元素事件 03 4 if parser getName equalsIgnoreCase person 036 curren tPerson null 037 038 039 break 040 041 042 eventType parser next 043 044 045 inStream close 046 returnpersons 047 catch Exception e 048 e printStackTrace 049 050 051 returnnull 052 053 054 055 成 XML 文件 056 使用 Pull 解析器生成一个与 itcast xml 文件内容相同的 myitcast xml 文件 057 public staticString writeXML List persons Writer writer 058 059 XmlSerializer serializer Xml newSerializer 060 061 try 062 serializer setOutput writer 063 serializer startDocument UTF 8 true 064 065 第一个参数为命名空间 如果不使用命名空间 可以设置为 null 066 serializer startTag persons 067 068 for Person person persons 069 serializer startTag person 070 serializer attribute id person getId toString 071 serializer startTag name 072 serializer text person getName 073 serializer endTag name 074 serializer startTag age 075 serializer text person getAge toString 076 serializer endTag age 077 serializer endTag person 078 079 080 serializer endTag persons 081 serializer endDocument 082 083 returnwriter toString 084 catch Exception e 085 e printStackTrace 086 087 0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论