Windows Phone 开发学习笔记(十) RSS阅读器之解析数据

上一篇文章已经完成XML页面数据的获取,接着需要解析获得的数据。虽然只需读取有效内容,仍然要对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数据,还要进行显示上的处理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值