首先创建一个实体类 Mp3Info用来存储解析的XML文件中的内容:

    public class Mp3Info implements Serializable{
      private static final long serialVersionUID = 1L;
      private String id;
      private String mp3Name;
      private String mp3Size;
      private String lrcName;
      private String lrcSize;
      public String getId() {
        return id;
      }
      public void setId(String id) {
        this.id = id;
      }
      public String getMp3Name() {
        return mp3Name;
      }
      public void setMp3Name(String mp3Name) {
        this.mp3Name = mp3Name;
      }
      public String getMp3Size() {
        return mp3Size;
      }
      public void setMp3Size(String mp3Size) {
        this.mp3Size = mp3Size;
      }
      public String getLrcName() {
        return lrcName;
      }
      public void setLrcName(String lrcName) {
        this.lrcName = lrcName;
      }
      public String getLrcSize() {
        return lrcSize;
      }
      public void setLrcSize(String lrcSize) {
        this.lrcSize = lrcSize;
      }
      public Mp3Info(String id, String mp3Name, String mp3Size, String lrcName,
        String lrcSize) {
          super();
          this.id = id;
          this.mp3Name = mp3Name;
          this.mp3Size = mp3Size;
          this.lrcName = lrcName;
          this.lrcSize = lrcSize;
      }
      public Mp3Info() {
        super();
      }
      @Override
      public String toString() {
        return "Mp3Info [id=" + id + ", mp3Name=" + mp3Name + ", mp3Size="
            + mp3Size + ", lrcName=" + lrcName + ", lrcSize=" + lrcSize
            + "]";
      }

    }

  文件下载后将文件存入一个String类型的变量中,从而对文件进行解析,需创建一个Mp3ListContentHandler类,用来定义对读取的String字符串的解析过程:

    private List<Mp3Info> parse(String xmlStr){
      //创建一个SaxParserFactory
      SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
      //创建List数组,其中数据类型为Mp3Info
      List<Mp3Info> infos = new ArrayList<Mp3Info>();
      try{
        //生成XMLReader对象
        XMLReader xmlReader = saxParserFactory.newSAXParser().getXMLReader();
        Mp3ListContentHandler mp3ListContentHandler = new Mp3ListContentHandler(infos);
        //为XMLReader设置内容处理器,当遇到文件标签响应的位置时,触发相应的事件
        xmlReader.setContentHandler(mp3ListContentHandler);
        //开始解析文件,StringReader是IO流中的一个类,专门以流的方式处理一个字符串
        xmlReader.parse(new InputSource(new StringReader(xmlStr)));
        for(Iterator iterator = infos.iterator();iterator.hasNext();){
          Mp3Info mp3Info = (Mp3Info) iterator.next();    //此方法可以得到infos中的每一个Mp3Info对象
        }
      }catch(Exception e){
        e.printStackTrace();
      }
      return infos;   //此时得到的Infos对象,为XMLStr中的所有的元素Mp3Name,Mp3Size,LrcName,LrcSize
    }

  Mp3ListContentHandler类的定义如下:

    public class Mp3ListContentHandler extends DefaultHandler{

      private List<Mp3Info> infos = null;
      private Mp3Info mp3Info = null;
      //构造函数,在对象创建时,将infos对象进行赋值
      public Mp3ListContentHandler(List<Mp3Info> infos) {
        super();
        this.infos = infos;
      }

      private String tagName = null;
      public List<Mp3Info> getInfos() {
        return infos;
      }

      public void setInfos(List<Mp3Info> infos) {
        this.infos = infos;
      }
      //当开始解析文件时,就会调用startDocument方法
      @Override
      public void startDocument() throws SAXException {
        // TODO Auto-generated method stub
        super.startDocument();
      }
      @Override
      public void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {
          //uri就是当前正在解析的XML文件的命名空间,localName不带前缀的标签名称,qName是带前缀的标签名,attributes代表的是标签的属性
          this.tagName = localName;
          if(tagName.equals("resource")){
            //当遇到resource时生成一个mp3Info对象
            mp3Info = new Mp3Info();
          }
      }
      /**
       * 得到标签当中的内容,将当前内容存入ch的start开始,长度为length的数组中
      */
      @Override
      public void characters(char[] ch, int start, int length)
        throws SAXException {
          // TODO Auto-generated method stub
          String temp = new String(ch,start,length);
          if(tagName.equals("id")){
            mp3Info.setId(temp);
          }
          else if(tagName.equals("mp3.name")){
            mp3Info.setMp3Name(temp);
          }
          else if(tagName.equals("mp3.size")){
            mp3Info.setMp3Size(temp);
          }
          else if(tagName.equals("lrc.name")){
            mp3Info.setLrcName(temp);
          }
          else if(tagName.equals("lrc.size")){
            mp3Info.setLrcSize(temp);
          }
          super.characters(ch, start, length);
      }

      @Override
      public void endDocument() throws SAXException {
        // TODO Auto-generated method stub
      }

      @Override
      public void endElement(String uri, String localName, String qName)
        throws SAXException {
          if(qName.equals("resource")){
            //当遇到标签结尾时,将当前对象加入到List<Mp3Info>当中
            infos.add(mp3Info);
          }
          tagName = "";
      }
    }

  将解析得到的infos结果显示在Activity当中:

    private void UpdataListView(){
      //下载包含所有Mp3基本信息的xml文件
      String xml = downloadXML("http://192.168.1.105:8080/mp3/resources.xml");
      //对XML文件进行解析,并将解析的结果放入Mp3Info对象当中,最后将这些Mp3Info对象放置到List当中
      infos = parse(xml);
      //将SimpleAdapter对象设置到ListActivity当中
      SimpleAdapter simpleAdapter = buildSimpleAdapter(infos);
      Mp3ListActivity.this.setListAdapter(simpleAdapter);
    }
    private SimpleAdapter buildSimpleAdapter(List<Mp3Info> infos){
      //生成一个List对象,并按照SimpleAdapter的标准,将infos当中的数据添加到List当中去
      List<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>();
      for(Iterator iterator = infos.iterator();iterator.hasNext();){
        Mp3Info mp3Info = (Mp3Info) iterator.next();
        HashMap<String,String> map = new HashMap<String,String>();
        map.put("mp3_name", mp3Info.getMp3Name());
        map.put("size_id", mp3Info.getMp3Size());
        list.add(map);
      }
      //创建一个SimpleAdapter对象
      SimpleAdapter simpleAdapter = new SimpleAdapter(this, list,
        R.layout.mp3info_item, new String[] { "mp3_name", "size_id" },
          new int[] { R.id.mp3_name, R.id.size_id });
      // 将这个SimpleAdapter对象设置到ListActivity当中
      return simpleAdapter;
    }

XML文件解析并利用SimpleAdapter将解析结果显示在Activity中的更多相关文章

  1. Android -- 创建XML文件对象及其序列化, pull解析XML文件

    1. 创建XML文件对象及其序列化 示例代码:(模拟以xml格式备份短信到SD卡) SmsInfo.java, bean对象 /** * 短信的业务bean * @author Administrat ...

  2. Android程序解析XML文件的方法及使用PULL解析XML案例

    一.一般解析XML文件的方法有SAX和DOM.PULL (1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信 ...

  3. C#关于xml文件和TreeView之间的转换解析

    主窗体: using System; using System.Collections; using System.Collections.Generic; using System.Componen ...

  4. FOR XML PATH 语句的应用【所有列值显示在一行中】

    原文发布时间为:2010-10-20 -- 来源于本人的百度文章 [由搬家工具导入] 大家都知道在SQL Server中利用 FOR XML PATH 语句能够把查询的数据生成XML数据,下面是它的一 ...

  5. android基础知识13:AndroidManifest.xml文件解析

    注:本文转载于:http://blog.csdn.net/xianming01/article/details/7526987 AndroidManifest.xml文件解析. 1.重要性 Andro ...

  6. 使用Pull解析器生成XML文件和读取xml文件

    有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使 ...

  7. 【U1结业机试题】新闻内容管理系统:解析XML文件读取Html模版生成网页文件

    一.作业要求: 1.在xml文件中创建新闻节点news,包含标题.作者.日期.正文等信息 2.创建HTML模板文件 3.读取xml中所有新闻信息,并使用新闻信息替换模板文件中占位符,从而为每一条新闻生 ...

  8. JAVA使用SAX解析XML文件

    在我的另一篇文章(http://www.cnblogs.com/anivia/p/5849712.html)中,通过一个例子介绍了使用DOM来解析XML文件,那么本篇文章通过相同的XML文件介绍如何使 ...

  9. Tomcat源码分析——SERVER.XML文件的加载与解析

    前言 作为Java程序员,对于Tomcat的server.xml想必都不陌生.本文基于Tomcat7.0的Java源码,对server.xml文件是如何加载和解析的进行分析. 加载 server.xm ...

随机推荐

  1. ubuntu自定义分辨率

    首先说下为啥要专门敲个文章来说明这个问题,因为我最近入手了一台分辨率为3200*1800的高分辨率笔记本,但使用的时候发现现在的操作系统及其诸多软件对高分辨率屏幕的支持真的是太烂,字体发虚或者变得非常 ...

  2. 资深人士剖析微软开源.NET事件:战略重心已经从PC转移到云端

    本文是雷锋网对我的访谈整理的文章,源地址是 http://www.leiphone.com/news/201411/6KaGhD7PDABnvrRf.html 2014年11月13日,微软表示开源.N ...

  3. HTML5- Canvas入门(一)

    周老虎落网的时候,网易跟腾讯都推出了牛逼轰轰的HTML5页面来展示其关系网(网易http://news.163.com/special/data_zyk/  ,腾讯http://news.qq.com ...

  4. 每周一书《Oracle 12 c PL(SQL)程序设计终极指南》

    本周为大家送出的书是<Oracle 12 c PL(SQL)程序设计终极指南>,此书由机械工业出版社出版, 孙风栋,王澜,郭晓惠 著. 内容简介: <Oracle 12c PL/SQ ...

  5. 剑指Offer面试题:12.在O(1)时间删除链表结点

    一.题目:在O(1)时间删除链表结点 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 原文采用的是C/C++,这里采用C#,节点定义如下: public class ...

  6. [Unity][Heap sort]用Unity动态演示堆排序的过程(How Heap Sort Works)

    [Unity][Heap sort]用Unity动态演示堆排序的过程 How Heap Sort Works 最近做了一个用Unity3D动态演示堆排序过程的程序. I've made this ap ...

  7. 在浏览器的背后(二) —— HTML语言的语法解析

    当你看到这篇文章意味着我辜负了@教主的殷切期望周末木有去约会,以及苏老师@我思故我在北京鼓楼的落井下石成功了…… 本文demo powered by 已经结婚的@老赵的不再维护的wind.js 物是人 ...

  8. ls /usr/linkapp 没反应

    ls /usr/linkapp ll /usr/linkapp  都是一样无反应 没有任何反应, ctrl + c /  ctrl + d 都不行 但是 ls /usr/linkapp/ | wc - ...

  9. Git命令汇总

    1. 工作区和版本库 说明: 工作区(Working Directory)就是创建仓库的文件夹 版本库(Repository)就是工作区的隐藏目录.git,版本库中有暂存区(stage/index)和 ...

  10. StartUML的基础的使用,用例图,序列图

    转载地址  http://blog.csdn.NET/tianhai110 (下面参考了原博主的内容,也加入自己的内容,为了自己脑补,也方便其他看到的人脑补) 使用StartUML绘制用例图:     ...