1、 考核知识点 XML解析 2、 练习目标 掌握XML的解析 3、 需求分析 实际生活中,大多数人会在手机中安装一个天气预报的软件,如墨迹天气、懒人天气等。这些软件在获取天气信息时,都是通过解析XML文件得到的,下面就通过一个案例“植物百科”来演示如何解析XML文件。 4、 设计思路(实现原理) 1) 创建plant.xml文件 2) 使用pull解析plant.xml并得到相应的植物信息 3) 在布局中更换植物的简介、图片 (1)创建“植物百科”程序 创建“植物百科”程序,该程序的界面对应的布局文件activity_main.xml的代码如下所示: xmlns:tools='http://schemas./tools' android:layout_width='match_parent' android:layout_height='match_parent' tools:context='.MainActivity' > <> android:layout_width='match_parent' android:layout_height='wrap_content' android:orientation='vertical'> <> android:id='@+id/imgv_plant' android:layout_width='match_parent' android:layout_height='150dp' android:scaleType='matrix'/> <> android:layout_width='wrap_content' android:layout_height='wrap_content' android:text='内容简介' android:layout_margin='10dp' android:textColor='@android:color/darker_gray'/> <> android:id='@+id/tv_plants_content' android:layout_width='wrap_content' android:layout_height='wrap_content' android:padding='5dp'/>
<> android:layout_width='match_parent' android:layout_height='wrap_content' android:orientation='horizontal' android:layout_alignParentBottom='true'> <> android:id='@+id/btn_xrq' android:layout_width='0dp' android:layout_height='wrap_content' android:layout_weight='1' android:text='仙人球' android:background='@drawable/normal_button'/> <> android:id='@+id/btn_xyc' android:layout_width='0dp' android:layout_height='wrap_content' android:layout_weight='1' android:text='薰衣草' android:background='@drawable/normal_button'/> <> android:id='@+id/btn_xrk' android:layout_width='0dp' android:layout_height='wrap_content' android:layout_weight='1' android:text='向日葵' android:background='@drawable/normal_button'/>
(2)创建plant.xml 在工程src根目录中创建一个plant.xml文件,该文件中包含三种植物的信息,具体如下所示: (3)创建javebean PlantInfo类 从plant.xml代码中可以看出,每种植物信息都包含name、content属性,为了方便后续的使用,可以将这两个属性封装成一个Javabean,具体代码如下所示: 1 /**植物信息*/ 1 public class PlantInfo { 2 private String plantName; 3 private String plantContent; 4 public String getPlantName() { 5 return plantName; 6 } 7 public void setPlantName(String plantName) { 8 this.plantName = plantName; 9 } 10 public String getPlantContent() { 11 return plantContent; 12 } 13 public void setPlantContent(String plantContent) { 14 this.plantContent = plantContent; 15 } 16 } (4)创建工具类utils 为了代码的更加易于阅读,避免大量代码都在一个类中,因此创建一个用来解析XML文件的工具类utils。utils类中定义了一个getPlantsInfos()方法,该方法中包含了解析XML文件的逻辑代码,具体代码如下所示: 1 /** 解析xml文件的工具类 */ 17 public class utils { 18 // 返回天气信息的集合 19 public static List 20 throws Exception { 21 // 得到pull解析器 22 XmlPullParser parser = Xml.newPullParser(); 23 // 初始化解析器,第一个参数代表包含xml的数据 24 parser.setInput(is, 'utf-8'); 25 List 26 PlantInfo plantInfo = null; 27 // 得到当前事件的类型 28 int type = parser.getEventType(); 29 // END_DOCUMENT文档结束标签 30 while (type != XmlPullParser.END_DOCUMENT) { 31 switch (type) { 32 // 一个节点的开始标签 33 case XmlPullParser.START_TAG: 34 // 解析到全局开始的标签 infos 根节点 35 if ('plants'.equals(parser.getName())) { 36 plantInfos = new ArrayList 37 } else if ('plantsInfo'.equals(parser.getName())) { 38 plantInfo = new PlantInfo(); 39 } else if ('name'.equals(parser.getName())) { 40 // parset.nextText()得到该tag节点中的内容 41 String name = parser.nextText(); 42 plantInfo.setPlantName(name); 43 } else if ('content'.equals(parser.getName())) { 44 String content = parser.nextText(); 45 plantInfo.setPlantContent(content); 46 } 47 break; 48 // 一个节点结束的标签 49 case XmlPullParser.END_TAG: 50 // 一个城市的信息处理完毕,city的结束标签 51 if ('plantsInfo'.equals(parser.getName())) { 52 // 一个城市的信息 已经处理完毕了. 53 plantInfos.add(plantInfo); 54 plantInfo = null; 55 } 56 break; 57 } 58 // 只要不解析到文档末尾,就解析下一个条目。得到下一个节点的事件类型 59 // 注意,这个一定不能忘,否则会成为死循环 60 type = parser.next(); 61 } 62 return plantInfos; 63 } 64 } (5)编写与界面交互的逻辑代码 在MainActivity中编写与界面交互的逻辑代码,具体如下所示: 1 public class MainActivity extends Activity implements OnClickListener { 65 private List 66 private TextView mPlantContentTV; 67 private ImageView mPlantImgv; 68 @Override 69 protected void onCreate(Bundle savedInstanceState) { 70 super.onCreate(savedInstanceState); 71 setContentView(R.layout.activity_main); 72 try { 73 //获取植物信息 74 plantInfos = utils.getPlantInfos(MainActivity.class 75 .getClassLoader().getResourceAsStream('plant.xml')); 76 77 } catch (Exception e) { 78 e.printStackTrace(); 79 } 80 initView(); 81 } 82 /** 83 * 初始化控件 84 */ 85 private void initView() { 86 findViewById(R.id.btn_xrq).setOnClickListener(this); 87 findViewById(R.id.btn_xrk).setOnClickListener(this); 88 findViewById(R.id.btn_xyc).setOnClickListener(this); 89 mPlantContentTV = (TextView)findViewById(R.id.tv_plants_content); 90 mPlantImgv = (ImageView) findViewById(R.id.imgv_plant); 91 mPlantContentTV.setText('\u3000\u3000'+plantInfos.get(0).getPlantContent()); 92 mPlantImgv.setBackgroundResource(R.drawable.a); 93 } 94 @Override 95 public void onClick(View v) { 96 switch (v.getId()) { 97 case R.id.btn_xrq: 98 //设置植物简介 99 mPlantContentTV.setText('\u3000\u3000'+plantInfos.get(0).getPlantContent()); 100 mPlantImgv.setBackgroundResource(R.drawable.a); 101 break; 102 case R.id.btn_xyc: 103 mPlantContentTV.setText('\u3000\u3000'+plantInfos.get(1).getPlantContent()); 104 mPlantImgv.setBackgroundResource(R.drawable.c); 105 break; 106 case R.id.btn_xrk: 107 mPlantContentTV.setText('\u3000\u3000'+plantInfos.get(2).getPlantContent()); 108 mPlantImgv.setBackgroundResource(R.drawable.b); 109 break; 110 } 111 } 112 } (6)运行程序 运行“植物百科”程序,能看到如图4-4左侧所示的界面,点击“向日葵”按钮可以看到图4-4右侧所示的界面。 图4-1 植物百科运行界面 2、往TextView的setText()方法传入“\u3000”代表空格。 |
|