小猪的Android入门之路 Day 8 part 1
Android网络编程浅析——xml文件的解析
---转载请注明出处:coder-pig
本节引言:
在不知不觉间,本系列的博客已经写到了第8天了,很多朋友反馈受益良多,帮到各位
笔者倍感欣慰,本来Day 8是想解析Android的图形与图像处理的,不过笔者想来想去,
还是决定先讲解下Android中的网络编程,因为有朋友提议讲解下网络方面的,所以
在Day 8中我们将会浅析Android在网络方面的一些应用,而本博客是面向初学者的,
而且鉴于笔者的水平,所以只是浅析,而非深入!在Day 8 中我们会讲解一些基本的
网络应用,如下载网络上的数据,图片,文件xml,Json,构建简单的客户端与服务端交
互等!而在Part 1中我们将详细地讲解XML与解析XML的常用方法!
本节学习路线图:
本节正文:
Android与互联网交互的三种方式:
XML文件要点介绍:
Android中解析XML的常用方法比较:
SAX解析XML文件:
SAX解析XML的流程
核心代码:
①SaxService.java:
package com.jay.example.service; import java.util.ArrayList; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import android.util.Log; import com.jay.example.bean.Person; public class SaxService extends DefaultHandler{ private Person person; private ArrayList<Person> persons; //当前解析的元素标签 private String tagName = null; //当读取到文档开始标志时触发,通常在这里完成一些初始化操作 @Override public void startDocument() throws SAXException { this.persons = new ArrayList<Person>(); Log.i("SAX", "读取到文档头,开始解析xml"); } //读到一个开始标签时调用,第二个参数为标签名,最后一个参数为属性数组 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if(localName.equals("person")) { person = new Person(); person.setId(Integer.parseInt(attributes.getValue("id"))); Log.i("SAX", "读取标签"); } this.tagName = localName; } //处理xml文件读到到内容,第一个参数为字符串内容,后面依次为起始位置与长度 @Override public void characters(char[] ch, int start, int length) throws SAXException { //判断当前标签是否有效 if(this.tagName != null) { String data = new String(ch,start,length); //读取标签中的内容 if(this.tagName.equals("name")) { this.person.setName(data); } else if(this.tagName.equals("age")) { this.person.setAge(Integer.parseInt(data)); } } } //文档结束部分,这里将对象添加到结合中 @Override public void endElement(String uri, String localName, String qName) throws SAXException { if(localName.equals("person")) { this.persons.add(person); person = null; } this.tagName = null; } //获取persons集合 public ArrayList<Person> getPersons() { return persons; } }
②MainActivity中的readXML( )方法:
private ArrayList<Person> readxml() throws Exception { //获取文件资源建立输入流对象 InputStream is = getAssets().open("persons.xml"); //①创建XML解析处理器 SaxService ss = new SaxService(); //②得到SAX解析工厂 SAXParserFactory factory = SAXParserFactory.newInstance(); //③创建SAX解析器 SAXParser parser = factory.newSAXParser(); //④将xml解析处理器分配给解析器,对文档进行解析,将事件发送给处理器 parser.parse(is,ss); is.close(); return ss.getPersons(); }
Dom解析xml文件
Dom解析xml的流程
核心代码:
dom解析xml的代码:
public static ArrayList<Person> queryXML(Context context) { ArrayList<Person> Persons = new ArrayList<Person>(); try { //①获得DOM解析器的工厂示例: DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); //②从Dom工厂中获得dom解析器 DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder(); //③把要解析的xml文件读入Dom解析器 Document doc = dbBuilder.parse(context.getAssets().open("persons2.xml")); System.out.println("处理该文档的DomImplemention对象=" + doc.getImplementation()); //④得到文档中名称为person的元素的结点列表 NodeList nList = doc.getElementsByTagName("person"); //⑤遍历该集合,显示集合中的元素以及子元素的名字 for(int i = 0;i < nList.getLength();i++) { //先从Person元素开始解析 Element personElement = (Element) nList.item(i); Person p = new Person(); p.setId(Integer.valueOf(personElement.getAttribute("id"))); //获取person下的name和age的Note集合 NodeList childNoList = personElement.getChildNodes(); for(int j = 0;j < childNoList.getLength();j++) { Node childNode = childNoList.item(j); //判断子note类型是否为元素Note if(childNode.getNodeType() == Node.ELEMENT_NODE) { Element childElement = (Element) childNode; if("name".equals(childElement.getNodeName())) p.setName(childElement.getFirstChild().getNodeValue()); else if("age".equals(childElement.getNodeName())) p.setAge(Integer.valueOf(childElement.getFirstChild().getNodeValue())); } } Persons.add(p); } } catch (Exception e) {e.printStackTrace();} return Persons; }
使用pull解析器解析XML文件
使用代码示例:
为了方便演示,将三种解析方法都打包到一个程序中:
分别使用三种方式解析xml文件,另外还有使用pull解析器生成xml文件,在data/data/<包名>/file目录下
可以找到生成的xml文件
效果图:
参考代码:代码下载
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。