小猪的Android入门之路 Day 8 part 1
来源:互联网 发布:前列腺高潮叙述知乎 编辑:程序博客网 时间:2024/05/21 17:56
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文件
效果图:
参考代码:代码下载
0 0
- 小猪的Android入门之路 Day 8 part 1
- 小猪的Android入门之路 Day 8 part 2
- 小猪的Android入门之路 Day 8 part 3
- 小猪的Android入门之路 Day 8 part 4
- 小猪的Android入门之路 Day 8 part 5
- 小猪的Android入门之路 Day 8 part 6
- 小猪的Android入门之路 Day 3 - part 1
- 小猪的Android入门之路 Day 4 - part 1
- 小猪的Android入门之路 Day 5 - part 1
- 小猪的Android入门之路 Day 7 part 1
- 小猪的Android入门之路 Day 9 part 1
- 小猪的Android入门之路 Day 5 - part
- 小猪的Android入门之路 Day 3 - part 2
- 小猪的Android入门之路 Day 3 - part 3
- 小猪的Android入门之路 Day 4 - part 2
- 小猪的Android入门之路 Day 4 - part 3
- 小猪的Android入门之路 Day 4 - part 4
- 小猪的Android入门之路 Day 5 - part 2
- 图文详解YUV420数据格式
- 优秀的程序员都避开了哪些坑?
- lua与c (一)Mac下c 和lua环境搭建
- 小猪的Android入门之路 Day 7 part 4
- SQL学习(三)
- 小猪的Android入门之路 Day 8 part 1
- 黑马程序员_反射的应用
- YUV422 YUV420 Planar \ Semi-Planar \ Interleaved
- Jenkins学习(二)使用插件方式配置打ipa包
- Android UI组件进阶(1)——带进度条的按钮
- STL编程题2(C++程序设计第8周)
- 优秀程序员的 18 大法则
- Android导入项目问题
- 关于java中路径的思考:相对路径,以及在不同场景下的区别 classpath