Windows Phone 开发学习笔记(十) RSS阅读器之解析数据
2012-08-06 07:59
555 查看
上一篇文章已经完成XML页面数据的获取,接着需要解析获得的数据。虽然只需读取有效内容,仍然要对XML格式有基本了解。
XML(Extensible Markup Language)即可扩展标记语言,由一系列自定义标签和数据组成,可以结构化信息,方便存储和传输。下面是新浪科技新闻频道XML页面(http://rss.sina.com.cn/tech/rollnews.xml)源代码的一部分(去掉开头的注释):
其中像<channel></channel>,<item></item>被称为标签,名称可以自定义,且区分大小写。XML 元素指从开始标签到结束标签的内容,包括标签本身。XML元素可包含其他元素和文本,并且可以拥有属性,属性值须加引号,上面源代码中<rssversion="2.0">声明了一个version属性,并赋值为2.0。XML页面以树结构来组织数据。每个元素是一个节点,元素的子元素便是这个节点的子节点,元素的文本内容就是这棵树的叶子。上面的源文件可以用树状结构来描述,如图1:
图1 XML页面结构示意图
了解XML页面的基本结构之后就可以进行解析了,这里只获取“新闻标题”、“新闻内容”、“发布时间”、“新闻链接”这四项,分别对应XML页面中item的子元素title、description、pubDate、link。从XML页面中提取这几个元素的数据十分简单,因为可以直接使用XElement类对XML数据流进行解析,详细说明见MSDN:
http://msdn.microsoft.com/zh-cn/library/system.xml.linq.xelement(v=vs.95).aspx
这里只介绍用到的函数。
使用XElement首先需要引入System.Xml.Linq.dll,右击项目里的References文件夹,如图2,接着选择“AddReferences…”弹出如图3所示对话框,找到System.Xml.Linq,将其加入项目。
图2 添加References
图3 添加System.Xml.Linq.dll
开始正式编码阶段,再MainPage.xaml.cs中添加System.Xml.Linq命名空间,此时所有命名空间如下:
HTTP请求部分的代码基本不变,只需要更改处理数据流的部分,结果如下:
这里用到XElement的三个成员函数
Load(Stream)
MSDN说明:使用指定的流创建一个新的 XElement 实例。
Descendants(XName)
MSDN说明:按文档顺序返回此文档或元素的经过筛选的子代元素集合。 集合中只包括具有匹配 XName 的元素。
Elements(XName)
MSDN说明:获取具有指定 XName 的第一个(按文档顺序)子元素。
注意Descendants说明中的红字“子代”,这表示Descendants会搜索当前节点下的所有节点,返回筛选的元素集合。在XElement类中,还有一个与Descendants功能类似的函数Elements(XName),不过它只搜索当前节点的子节点,不包括子节点以下的节点。当前载入的XML页面根元素为rss,只有一个子元素channel,方便起见使用Descendants函数获取所有item,如果页面中包括多个channel,需要分别处理。
运行前,把Textblock的文字大小设置为20,这样能看的更清晰,实际效果如图4所示:
图4 最终运行效果
可以看到XML页面已经正确解析,并按照想要的格式显示出来,当然,实际使用的RSS阅读器不能这么简陋,基于解析的XML数据,还要进行显示上的处理。
XML(Extensible Markup Language)即可扩展标记语言,由一系列自定义标签和数据组成,可以结构化信息,方便存储和传输。下面是新浪科技新闻频道XML页面(http://rss.sina.com.cn/tech/rollnews.xml)源代码的一部分(去掉开头的注释):
<?xml version="1.0"encoding="utf-8"?> <?xml-stylesheet type="text/xsl"title="XSL Formatting" href="/show_new_final.xsl"media="all"?> <rss version="2.0"> <channel> <title> <![CDATA[科技要闻-新浪科技]]> </title> <image> <title> <![CDATA[科技时代]]> </title> <link>http://tech.sina.com.cn</link> <url>http://www.sinaimg.cn/home/deco/2009/0330/logo_home_tech_news.gif</url> </image> <description> <![CDATA[科技时代-科技要闻]]> </description> <link>http://tech.sina.com.cn/roll.shtml</link> <language>zh-cn</language> <generator>WWW.SINA.COM.CN</generator> <ttl>5</ttl> <copyright> <![CDATA[Copyright1996 - 2012 SINA Inc. All Rights Reserved]]> </copyright> <pubDate>Thu,2 Aug 2012 11:32:09 GMT</pubDate> <category> <![CDATA[]]> </category> <item> <title> <![CDATA[专访熊晓鸽:每月投资1-2家移动互联网企业]]> </title> <link>http://go.rss.sina.com.cn/redirect.php?url=http://tech.sina.com.cn/i/2012-08-02/18367459938.shtml</link> <author>WWW.SINA.COM.CN</author> <guid>http://go.rss.sina.com.cn/redirect.php?url=http://tech.sina.com.cn/i/2012-08-02/18367459938.shtml</guid> <category> <![CDATA[科技时代-科技要闻]]> </category> <pubDate>Thu,2 Aug 2012 10:36:29 GMT</pubDate> <comments>http://comment.news.sina.com.cn/cgi-bin/comment/comment.cgi?channel=gn&newsid=2-1-3096418</comments> <description> <![CDATA[ 新浪科技讯 8月2日下午消息,IDG资本创始合伙人熊晓鸽今天下午接受新浪科技专访时透露,IDG现在每个月都要投资1-2家移动互联网公司。他还建议,中美两国通过对话机制解决VIE(可变利益实体)问题。 Macworld Asia 2012数字世界亚洲博览会今天开幕。作为IDG旗下的重要展会....]]> </description> </item> …… …… </channel> </rss>
其中像<channel></channel>,<item></item>被称为标签,名称可以自定义,且区分大小写。XML 元素指从开始标签到结束标签的内容,包括标签本身。XML元素可包含其他元素和文本,并且可以拥有属性,属性值须加引号,上面源代码中<rssversion="2.0">声明了一个version属性,并赋值为2.0。XML页面以树结构来组织数据。每个元素是一个节点,元素的子元素便是这个节点的子节点,元素的文本内容就是这棵树的叶子。上面的源文件可以用树状结构来描述,如图1:
图1 XML页面结构示意图
了解XML页面的基本结构之后就可以进行解析了,这里只获取“新闻标题”、“新闻内容”、“发布时间”、“新闻链接”这四项,分别对应XML页面中item的子元素title、description、pubDate、link。从XML页面中提取这几个元素的数据十分简单,因为可以直接使用XElement类对XML数据流进行解析,详细说明见MSDN:
http://msdn.microsoft.com/zh-cn/library/system.xml.linq.xelement(v=vs.95).aspx
这里只介绍用到的函数。
使用XElement首先需要引入System.Xml.Linq.dll,右击项目里的References文件夹,如图2,接着选择“AddReferences…”弹出如图3所示对话框,找到System.Xml.Linq,将其加入项目。
图2 添加References
图3 添加System.Xml.Linq.dll
开始正式编码阶段,再MainPage.xaml.cs中添加System.Xml.Linq命名空间,此时所有命名空间如下:
using System; using System.Windows; using System.Windows.Controls; using Microsoft.Phone.Controls; using System.Net; using System.IO; using System.Xml.Linq;
HTTP请求部分的代码基本不变,只需要更改处理数据流的部分,结果如下:
if (streamResult != null) { // load the XML XElement xmlFeed = XElement.Load(streamResult); Deployment.Current.Dispatcher.BeginInvoke(new Action(()=> { foreach (XElementcurElement in xmlFeed.Descendants("item")) { HelloText.Text+= (String)(curElement.Element("title")) + "\n"; HelloText.Text+= (String)(curElement.Element("pubDate")) + "\n"; HelloText.Text+= (String)(curElement.Element("description")) + "\n"; HelloText.Text+= (String)(curElement.Element("link")) + "\n"; HelloText.Text+= "\n"; } })); }
这里用到XElement的三个成员函数
Load(Stream)
MSDN说明:使用指定的流创建一个新的 XElement 实例。
Descendants(XName)
MSDN说明:按文档顺序返回此文档或元素的经过筛选的子代元素集合。 集合中只包括具有匹配 XName 的元素。
Elements(XName)
MSDN说明:获取具有指定 XName 的第一个(按文档顺序)子元素。
注意Descendants说明中的红字“子代”,这表示Descendants会搜索当前节点下的所有节点,返回筛选的元素集合。在XElement类中,还有一个与Descendants功能类似的函数Elements(XName),不过它只搜索当前节点的子节点,不包括子节点以下的节点。当前载入的XML页面根元素为rss,只有一个子元素channel,方便起见使用Descendants函数获取所有item,如果页面中包括多个channel,需要分别处理。
运行前,把Textblock的文字大小设置为20,这样能看的更清晰,实际效果如图4所示:
图4 最终运行效果
可以看到XML页面已经正确解析,并按照想要的格式显示出来,当然,实际使用的RSS阅读器不能这么简陋,基于解析的XML数据,还要进行显示上的处理。
相关文章推荐
- Windows Phone 开发学习笔记(九) RSS阅读器之获取数据
- Windows Phone 开发学习笔记(十一) RSS阅读器之显示数据
- DT大数据梦工厂-Scala学习笔记(1):Scala开发环境搭建和HelloWorld解析
- C#开发学习笔记:C#利用代码导入Excel数据
- iOS学习笔记(九)—— xml数据解析
- ZP的EXTJS学习笔记(三)——邮箱功能的开发(按钮事件、下拉框、分页、record小图标、整条数据格式处理、定时刷新、record复选删除、分组)
- ASP.Net MVC开发基础学习笔记(7):数据查询页面
- Android开发学习笔记:数据存取之SQLite浅析
- iOS学习笔记(九)——xml数据解析
- Cocos2d-x学习笔记(十三)—— 数据解析(json/xml)
- windows phone开发学习--Pivot动态加载数据
- windows phone 8 开发学习笔记(二)
- Android开发学习笔记:数据存取之Preference浅析
- 学习笔记——天气数据解析2(JSON格式数据)
- Android开发学习笔记:数据存取之SQLite浅析
- ios开发学习笔记--数据持久化之归档解档(NSKeyedArchiver/ NSKeyedUnarchiver)
- SpringMVC学习笔记六:使用Formatter解析或格式化数据
- Android开发学习笔记:数据存取之SQLite浅析
- 【Cocos2d-X开发学习笔记】第29期:游戏中数据的存储(上)
- Kinect开发学习笔记之(六)带游戏者ID的深度数据的提取