小猪的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:

[java] view plaincopyprint?
  1. package com.jay.example.service;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import org.xml.sax.Attributes;  
  6. import org.xml.sax.SAXException;  
  7. import org.xml.sax.helpers.DefaultHandler;  
  8.   
  9. import android.util.Log;  
  10.   
  11. import com.jay.example.bean.Person;  
  12.   
  13. public class SaxService extends DefaultHandler{  
  14.       
  15.     private Person person;  
  16.     private ArrayList<Person> persons;  
  17.     //当前解析的元素标签  
  18.     private String tagName = null;  
  19.       
  20.       
  21.     //当读取到文档开始标志时触发,通常在这里完成一些初始化操作  
  22.     @Override  
  23.     public void startDocument() throws SAXException {  
  24.         this.persons = new ArrayList<Person>();  
  25.         Log.i("SAX""读取到文档头,开始解析xml");  
  26.     }  
  27.       
  28.     //读到一个开始标签时调用,第二个参数为标签名,最后一个参数为属性数组  
  29.     @Override  
  30.     public void startElement(String uri, String localName, String qName,  
  31.             Attributes attributes) throws SAXException {  
  32.         if(localName.equals("person"))  
  33.         {  
  34.             person = new Person();  
  35.             person.setId(Integer.parseInt(attributes.getValue("id")));  
  36.             Log.i("SAX""读取标签");  
  37.         }  
  38.         this.tagName = localName;  
  39.     }  
  40.       
  41.     //处理xml文件读到到内容,第一个参数为字符串内容,后面依次为起始位置与长度  
  42.     @Override  
  43.     public void characters(char[] ch, int start, int length)  
  44.             throws SAXException {  
  45.         //判断当前标签是否有效  
  46.         if(this.tagName != null)  
  47.         {  
  48.             String data = new String(ch,start,length);  
  49.             //读取标签中的内容  
  50.             if(this.tagName.equals("name"))  
  51.             {  
  52.                 this.person.setName(data);  
  53.             }  
  54.             else if(this.tagName.equals("age"))  
  55.             {  
  56.                 this.person.setAge(Integer.parseInt(data));  
  57.             }  
  58.         }  
  59.     }  
  60.       
  61.       
  62.     //文档结束部分,这里将对象添加到结合中  
  63.     @Override  
  64.     public void endElement(String uri, String localName, String qName)  
  65.             throws SAXException {  
  66.         if(localName.equals("person"))  
  67.         {  
  68.             this.persons.add(person);  
  69.             person = null;  
  70.         }  
  71.         this.tagName = null;  
  72.     }  
  73.       
  74.     //获取persons集合  
  75.     public ArrayList<Person> getPersons()  
  76.     {  
  77.         return persons;  
  78.     }  
  79.       
  80. }  

②MainActivity中的readXML( )方法:

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. private ArrayList<Person> readxml() throws Exception  
  2.     {  
  3.         //获取文件资源建立输入流对象  
  4.         InputStream is = getAssets().open("persons.xml");  
  5.         //①创建XML解析处理器  
  6.         SaxService ss = new SaxService();  
  7.         //②得到SAX解析工厂  
  8.         SAXParserFactory factory = SAXParserFactory.newInstance();  
  9.         //③创建SAX解析器  
  10.         SAXParser parser = factory.newSAXParser();  
  11.         //④将xml解析处理器分配给解析器,对文档进行解析,将事件发送给处理器  
  12.         parser.parse(is,ss);  
  13.         is.close();  
  14.         return ss.getPersons();  
  15.     }  






Dom解析xml文件



Dom解析xml的流程



核心代码:

dom解析xml的代码:

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. public static ArrayList<Person> queryXML(Context context)  
  2.     {  
  3.         ArrayList<Person> Persons = new ArrayList<Person>();  
  4.           
  5.         try {  
  6.             //①获得DOM解析器的工厂示例:  
  7.             DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();  
  8.             //②从Dom工厂中获得dom解析器  
  9.             DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();  
  10.             //③把要解析的xml文件读入Dom解析器  
  11.             Document doc = dbBuilder.parse(context.getAssets().open("persons2.xml"));  
  12.             System.out.println("处理该文档的DomImplemention对象=" + doc.getImplementation());  
  13.             //④得到文档中名称为person的元素的结点列表  
  14.             NodeList nList = doc.getElementsByTagName("person");  
  15.             //⑤遍历该集合,显示集合中的元素以及子元素的名字  
  16.             for(int i = 0;i < nList.getLength();i++)  
  17.             {  
  18.                 //先从Person元素开始解析  
  19.                 Element personElement = (Element) nList.item(i);  
  20.                 Person p = new Person();  
  21.                 p.setId(Integer.valueOf(personElement.getAttribute("id")));  
  22.                   
  23.                 //获取person下的name和age的Note集合  
  24.                 NodeList childNoList = personElement.getChildNodes();  
  25.                 for(int j = 0;j < childNoList.getLength();j++)  
  26.                 {  
  27.                     Node childNode = childNoList.item(j);  
  28.                     //判断子note类型是否为元素Note  
  29.                     if(childNode.getNodeType() == Node.ELEMENT_NODE)  
  30.                     {  
  31.                         Element childElement = (Element) childNode;  
  32.                         if("name".equals(childElement.getNodeName()))  
  33.                             p.setName(childElement.getFirstChild().getNodeValue());  
  34.                         else if("age".equals(childElement.getNodeName()))  
  35.                             p.setAge(Integer.valueOf(childElement.getFirstChild().getNodeValue()));   
  36.                     }  
  37.                 }  
  38.                 Persons.add(p);  
  39.             }         
  40.         } catch (Exception e) {e.printStackTrace();}  
  41.         return Persons;  
  42.     }  





使用pull解析器解析XML文件





使用代码示例:

为了方便演示,将三种解析方法都打包到一个程序中:

分别使用三种方式解析xml文件,另外还有使用pull解析器生成xml文件,在data/data/<包名>/file目录下

可以找到生成的xml文件


效果图:



参考代码:代码下载

0 0
原创粉丝点击