浏览 3205 次
锁定老帖子 主题:XML解析-DOM
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-03-24
最后修改:2010-03-24
关于XML解析 以前有说过 不过那是SAX方式的 今天说一下DOM方法
[序言] 1. 今天解析的目标是:香港天气rss 地址为: http://202.140.96.134:8080/FS-RSS/ftpfile/local_weather.xml
现在的目标就是:定制化该目标的解析办法 我们还是查看一下该地址的源文件 具体方法:
现在贴其源文件://注:为了阅读方便 我加了一些“回车换行”源文件是没有这些的 <?xml version="1.0" encoding="utf-8"?> <rss version="2.0"> <channel><title>HK Weather Today</title> <description>HK Weather Today</description> <item><title>HK Weather Today</title> <pubDate>Wed, 24 Mar 2010 07:00:00 GMT</pubDate> <description><![CDATA[Current Temperature = 22<br>Humidity = 96<br>UV Index = null<br>UV Intensity = null<br>Icon = SI<br><img src="img/SI.png" border="0"/> <br>]]> </description> </item> </channel></rss>
下面叙述具体怎么解析:
1. 定义界面 内有若干TextView 供显示结果用
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/city" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/time" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/temp" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/humidity" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/uvIndex" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/uvIntensity" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <ImageView android:id="@+id/image" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>
2. 得到各个View 的实例 public void initialView(){ city = (TextView)findViewById(R.id.city); time = (TextView)findViewById(R.id.time); temp = (TextView)findViewById(R.id.temp); hunidity = (TextView)findViewById(R.id.humidity); uvIndex = (TextView)findViewById(R.id.uvIndex); uvIntensity = (TextView)findViewById(R.id.uvIntensity); image = (ImageView)findViewById(R.id.image); }
3. 定义目标InputStream URL url = new URL(s); URLConnection connection = url.openConnection(); HttpURLConnection httpConnection = (HttpURLConnection)connection; InputStream in = httpConnection.getInputStream(); int responseCode = httpConnection.getResponseCode();
4. 定于DocumentBuilder实例 并解析目标 DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbfactory.newDocumentBuilder(); //解析目标 Document dom = db.parse(in);
5. 得到DocumentBuilder的所有Element Element docEle = dom.getDocumentElement();
6. 得到docEle 的"channel"分支 NodeList nl = docEle.getElementsByTagName("channel");
7. 解析 并得到自己关系的列 if (nl != null && nl.getLength() > 0) { for (int i = 0 ; i < nl.getLength(); i++) { //得到某行数据 Element entry = (Element)nl.item(i); Element info = (Element)entry.getElementsByTagName("item").item(0); //从该行中取出目标 方法:键值 Key-Value Element eTitle = (Element)info.getElementsByTagName("title").item(0); Element eDay = (Element)info.getElementsByTagName("pubDate").item(0); Element eDescription = (Element)info.getElementsByTagName("description").item(0); //取出其内容 String scity = eTitle.getFirstChild().getNodeValue(); String stime = eDay.getFirstChild().getNodeValue(); String sdescription = eDescription.getFirstChild().getNodeValue(); //遍历目标 以指定字符分割 然后按顺序放入String[] String[] string = sdescription.split("<br>"); String temporary = string[0]; String tenp = temporary.split("=")[1]; String humidity = string[1]; String hum = humidity.split("=")[1]; String uIndex = string[2]; String uv_Index = uIndex.split("=")[1]; String uIntensity = string[3]; String uv_Intensity = uIntensity.split("=")[1]; //String uIntensity = string[3]; String icoName = string[5]; String address = icoName.split(" ")[1]; String address1 = address.split("=")[1]; //去除两边的"\"" String address2 = address1.replaceAll("\"", ""); city.setText("地区:"+scity); time.setText("时间:"+stime); temp.setText("温度:"+tenp); hunidity.setText("湿度:"+hum); uvIndex.setText("紫外线指数:"+uv_Index); uvIntensity.setText("紫外线强度:"+uv_Intensity); image.setImageBitmap(queryImageByURI(ico_preface+address2)); } }
8. 实话说 具体怎么一步步解析的很难说 大家自己看代码 应该能理解 具体做法:类似于:剥花生 即:一层层剥 直至露出里面的东西
9. 对了 还有 即:根据图片名字 下载之 然后显示之 public final static String ico_preface = "http://202.140.96.134:8080/FS-RSS/"; public Bitmap queryImageByURI(String iu){ try{ URL imgURL = new URL(iu); URLConnection conn = imgURL.openConnection(); conn.connect(); InputStream is = conn.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); Bitmap bm = BitmapFactory.decodeStream(bis); bis.close(); is.close(); return bm; }catch(Exception e){ return null; } }
10. emulator 运行截图 哦 对了 别忘了打开网络权限 即: <uses-permission android:name="android.permission.INTERNET"></uses-permission>
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |