国内外的电台数据很多,起码有好几百,所以把这些数据都写到代码里面是不实际的。只能写成一个数据文件,程序启动的时候再去加载。保存这些简单数据,我们肯定会优先使用XML文件,今天讲讲如何读取XML里面的数据,然后填充到列表里面。

再把这张老截图贴出来,方便后面对应查看XML的数据。

(PS:新建的Q_Q_群,有兴趣可以加入一起讨论:Android群:322599434)

1、Android解析XML方法

Android里面读取XML文件有3种方法,其中两种是解析XML的常规方法:SAX和文档对象模型方法。以前我写C++的时候,最常用的是文档对象模型方法,因为这个方法遍历数据很方便,缺点是会把整个文件加载到内存,构建一个文档的树模型。对于数据量比较大的文件,比较耗内存。以前就经常使用TinyXML的解析库,我在博客园第一篇文章就是说如何使用TinyXML库,O(∩_∩)O哈哈~

SAX方法是事件驱动模型,也就是解析到哪个节点会回调相应方法,你需要做的就是在相应的方法里面编写你的解析代码,这个有点是解析速度快,而且不耗内存,不过需要你解析完整个文件。查找灵活性没有文档对象模型方便。

Android支持上述两种方法,TinyXML的解析库也集成在Android里面。除了上面两种方法,Android自己修改了一种新的方法来解析XML文件——XmlPullParser,这个新方法是基于SAX方法改进的。传统SAX是需要解析完整个XML文件,而XmlPullParser是可以中途中断,停止解析。也就是说只要你获取了你想要的信息,你就可以停止XML的解析工作,因此速度效率上都不错。

既然是Android官方的方法,这次就使用XmlPullParser来作为XML的解析(我这里数据量不大,用任何一种方法差别不大)。

2、定义XML数据格式

首先我们需要定义我们保存电台数据的XML格式,这是我定义的一种保存电台类型,以及电台类型下面具体电台数据的XML格式,<ChannelType>标签代表是什么类型的电台,包含了ID、名称、图标、级别等信息。

<RadioChannel>是具体的电台数据标签,保存了电台名称、图标、以及URL等重要信息。

//Edited by mythou
//http://www.cnblogs.com/mythou/
  <ChannelType ID="1"name="推荐电台"Icon="fm_icon"Level="1">    <RadioChannelID="001"name="猫扑电台"Icon="default_channel_icon"Level="2"URL="mms://ting.mop.com/mopradio"/><RadioChannelID="002"name="国际电台怀旧金曲"Icon="default_channel_icon"Level="2"URL="mms://live.cri.cn/oldies/"/><RadioChannelID="003"name="国际电台都市流行"Icon="default_channel_icon"Level="2"URL="mms://live.cri.cn/pop/"/></ChannelType>    

3、使用Pull解析XML

//Edited by mythou
//http://www.cnblogs.com/mythou/
public boolean getRadioListData(InputStream is, ArrayList<RadioChannelData> ChannelTypeList, ArrayList<ArrayList<RadioChannelData>> finalChanneldata) throws Exception {  Log.d(TAG, "parse InputStream="+is);//临时电台类型RadioChannelData tempChannelTypeItem = null;//临时电台数据对象RadioChannelData tempChannelItem = null;  //保存每个频道类型里面具体电台数据ArrayList<RadioChannelData> channelDataList = null;//显示ChannelType stringString channelTypeString="";//由android.util.Xml创建一个XmlPullParser实例  XmlPullParser parser = Xml.newPullParser(); //设置输入流 并指明编码方式  parser.setInput(is, "UTF-8");               int eventType = parser.getEventType();  while (eventType != XmlPullParser.END_DOCUMENT) {switch (eventType) {case XmlPullParser.START_DOCUMENT:  //处理文档开始break;  case XmlPullParser.START_TAG:  if (parser.getName().equals("ChannelType")) {//电台类型信息tempChannelTypeItem = new RadioChannelData();  tempChannelTypeItem.setChannelID(parser.getAttributeValue(0));tempChannelTypeItem.setChannelName(parser.getAttributeValue(1));tempChannelTypeItem.setChannelICON(parser.getAttributeValue(2));tempChannelTypeItem.setLevel(Integer.valueOf(parser.getAttributeValue(3)));//创建每个类型下的列表channelDataList = new ArrayList<RadioChannelData>();} else if (parser.getName().equals("RadioChannel")) {//具体电台信息tempChannelItem = new RadioChannelData();tempChannelItem.setChannelID(parser.getAttributeValue(0));tempChannelItem.setChannelName(parser.getAttributeValue(1));tempChannelItem.setChannelICON(parser.getAttributeValue(2));tempChannelItem.setLevel(Integer.valueOf(parser.getAttributeValue(3)));tempChannelItem.setChannelURL(parser.getAttributeValue(4));}  break;  case XmlPullParser.END_TAG:  if (parser.getName().equals("ChannelType")) {  //电台类型列表保存
                    ChannelTypeList.add(tempChannelTypeItem);  tempChannelTypeItem = null;   //把每个类型电台列表加入到总数据列表
                    finalChanneldata.add(channelDataList);channelDataList = null;}  else if (parser.getName().equals("RadioChannel")){channelDataList.add(tempChannelItem);  tempChannelItem = null;     }break;case XmlPullParser.END_DOCUMENT:break;  }  eventType = parser.next();  }  //Test mythou 打印读取的数据Log.d(TAG, "Print all radio channel Type----->"+ChannelTypeList.toString());Log.d(TAG, "Print all radio final channel data----->"+finalChanneldata.toString());return true;  }  

上面代码是我用来解析XML的代码,解析的数据保存到对应的ArrayList里面,当然我在程序里面也定义了响应的数据格式类用来保存数据,使用Pull解析XML很方便也很简单,这里不做详细介绍,对此不了解的朋友可以去查看相关文档,个人感觉使用Pull解析文档比使用文档对象模型要方便,起码遍历一次数据要快捷很多。

补充一点,我这里的图片文件只保存了图片文件的名字(不带后缀),我在程序里面会根据图片名称读取Drawable里面的图片资源。

界面数据相关的就讲到这里,下一次会讲解如何控制播放,也就是一个播放器的核心。

系列文章:

Android 开发自己的网络收音机1——功能要求及设计方案

Android 开发自己的网络收音机2——电台列表(SlidingMenu侧滑栏)

Android 开发自己的网络收音机3——电台分类(ExpandableListView)

Edited by mythou

原创博文,转载请标明出处:http://www.cnblogs.com/mythou/p/3231184.html 

Android 开发自己的网络收音机4——读取XML文件的电台数据相关推荐

  1. android 开发 电台,Android 开发自己的网络收音机3——电台分类(ExpandableListView)

    上一篇文章说了使用SlidingMenu开源项目实现侧滑栏,今天主要是讲解多级列表ExpandableListView的使用,以及如何使用它实现电台分类管理.ExpandableListView是An ...

  2. SQL Server中读取XML文件的简单做法

    SQL Server 2000使得以XML导出数据变得更加简单,但在SQL Server 2000中导入XML数据并对其进行处理则有些麻烦.本文介绍在SQL Server中读取XML文件的简单做法. ...

  3. java项目——Dom4j读取XML文件保存orecal数据库

    上一篇介绍了如何利用dom4j读取xml文件,连接数据库,换数据库的话直接修改XML文件,使配置更加灵 活,本篇博客主要介绍一下如何将XML文件导入到orecal数据库中. XML在现在的项目中的应用 ...

  4. tinyxml 读取文本节点_TinyXML读取xml文件

    TinyXML读取xml文件 2020-05-19 编程之家收集整理的这篇文章主要介绍了TinyXML读取xml文件,编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考. 例子 xml 内容: ...

  5. [转帖]C#执行SQL脚本,读取XML文件

    [转帖]C#执行SQL脚本,读取XML文件 需要添加如下引用: using System.IO; using System.Data.SqlClient; using System.Collectio ...

  6. java 存取xml数据_JAVA读取XML文件数据

    XML文档内容如下: title1 title2 title3 JAVA代码如下: package cn.mylucene; import java.io.File; import java.io.I ...

  7. C#中读取xml文件指定节点

    假设xml文件内容是 <?xml version="1.0" encoding="utf-8"?> <Workflow>   <A ...

  8. java读取XML文件的四种方式

    java读取XML文件的四种方式 Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT& ...

  9. DOM4j读取XML文件(SAXReader)

    为什么80%的码农都做不了架构师?>>>    DOM4j读取XML文件(SAXReader) 一.一个很好的SAXReader读写xml文件的例题: 总结: Document do ...

  10. Tensorflow 读取XML文件内容并对图片等比例缩放

    根据XML文件中对图片标记的信息读取,并显示在图片中. xml 文件内容: <annotation><folder>OXIIIT</folder><filen ...

最新文章

  1. 《Java虚拟机原理图解》5. JVM类加载器机制与类加载过程
  2. 法媒评马云996:亚洲独有的洗脑我们不懂
  3. PyTorch 之 Datasets
  4. 《系统集成项目管理工程师》必背100个知识点-58沟通方式
  5. HttpServletResponse对象介绍
  6. 使用Xtend构建Vaadin UI
  7. Python编程高手之路——第三章:数据类型
  8. 工具使用-----Jmeter的基础用法
  9. java如何存储一个向量到一个矩阵的一个位置_SIMD数据并行(一)——向量体系结构...
  10. 邂逅StringIndexOutOfBoundsException
  11. JavaScript学习(二十二)—动态创建表格
  12. sklearn 下的 ensemble learning
  13. python语言中文怎么读-python中文读什么
  14. 经验模态分解python_经验模态分解法简析 (转)
  15. cursor图标自定义
  16. win10打开计算机黑屏怎么办,win10系统重启黑屏怎么办
  17. 国内景色最震撼的9座雪山
  18. dreamweaver cs6 的破解方法
  19. 附录H-2 技术预研报告
  20. 体育赛事直播系统的实践之路

热门文章

  1. Linux基础操作命令
  2. 虚拟机Linux共享主机Windows文件夹
  3. 飞秋等级授权码_观点 | 谈谈网络安全等级保护与密码法
  4. rdlc和rdl的区别
  5. 纯css实现三角原理,兼容IE
  6. 频繁默认网关不可用_win7系统默认网关不可用频繁掉线的解决方法
  7. 既生瑜(zookeeper)何生亮(redis)上
  8. flutter手写板2.0 橡皮擦
  9. 使用piranha搭建高可用LVS集群
  10. MySQL查询上周(从周一~周日)