使用 LINQ to XML(使用它编写一个自定义的RSS阅读器)

示例下载(Orcas下编写)

什么是LINQ to XML?

LINQ to XML 是.NET 3.5内建的LINQ数据提供者,被实现在“System.Xml.Linq”命名空间。

LINQ to XML 提供了一个清晰的编程模型,使你可以读取、创建和写入XML数据。你也可以使用LINQ to XML对XML执行LINQ查询,XML内容可以来自文件系统,远端HTTP地址、Web服务或者内存XML数据。

相对于现在.NET中低层次的XmlReader/XmlWriter API,LINQ to XML 提供更为丰富(并且容易)的数据查询和处理。也比XmlDocument提供的DOM API更为高效(并使用更少内存)。

使用LINQ to XML查询本地XML文件

为了对LINQ to XML如何工作有个感官认识,我们使用自定义的结构创建一个如下简单的XML文件用来存放RSS订阅。     然后我们可以使用命名空间“System.Xml.Linq”里定义的新类XDoumnet来打开和查询上面的XML文档。特别的,我想过滤掉元素<Feed>属性status为disabled的节点。我可以用下面的代码实现:

uploads/200708/07_172533_step3.jpg


注意上面的代码片段,我是怎样使用XDocument.Load(path)——返回一个XDocument实例——静态方法来加载XML文件的。因为要在ASP.NET下运行这段代码,我用了Server.MapPath(path)帮助方法来获取XML文件的路径。

一旦有了XDocument实例,我可以使用LINQ查询表达式查找我要的数据。在上面的代码里我查询XML文件里的每一个<Feed>元素。对应的是下面的查询表达式:

from feed in feedXML.Decedents("Feed")  
 
然后使用一个过滤条件只返回那些要么没有“status”属性,要么“status”属性值没有被设为“disabled”的元素。

Where (feed.Attribute("status") Is Nothing) OrElse (feed.Attribute("status").Value <> "disabled")

然后使用select子句来指示我想要的数据的样子。如果简单的写成“select feed”,LINQ to XML 将返回匹配条件的表示每个XML元素的XElement对象组成的序列。在上面的代码实例中我使用到了匿名类型。

Select Name = feed.Element("Name").Value, Url = feed.Element("Url").Value   

就像你看到的一样,我可以像操作集合和数组一样来操作返回的数据序列。VS 2008对此匿名序列提供了的全面的智能感知和编译期检查。

我也可以将结果绑定到ASP.NET、Windows 窗体或者WPF上的UI控件。比如:在我的页面里定义一个下拉列表控件:

<div class=feed>
   
Feeds:<asp:DropDownList ID="DropDownList1"
                           DataValueField
="Url"
                           DataTextField
="Name"
                           runat
="server">
    
</asp:DropDownList>
                               
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
</div>

我可以使用下面的语法绑定结果:
// 使用XDocument.Load(path)静态方法加载xml文件    
XDocument feedXML = XDocument.Load(Server.MapPath("Feeds.xml"));    
   
// 使用LINQ查询语法    
var feeds = from feed in feedXML.Descendants("Feed")    
            where feed.Attribute(
"status"== null || feed.Attribute("status").Value == "disabled"   
            select 
new   
                   
{    
                       Name 
= feed.Element("Name").Value,    
                       Url 
= feed.Element("Url").Value    
                   }
;    
   
// 数据邦定    
DropDownList1.DataSource = feeds;    
DropDownList1.DataBind();   
运行后的样子如下:

uploads/200708/07_205037_step4.gif


使用LINQ to XML检索远端XML RSS订阅

XDocument.Load(path)静态方法同时支持打开本地XML文件和通过HTTP地址访问远端XML。你可以用它访问远端RSS订阅,或者其他网站发布的XML数据。

作为一个例子,让我们看下我的Blog订阅的XML样子(http://www.xwy2.com/feed.asp):

uploads/200708/07_210300_step5.gif


我可以编写下面的LINQ to XML代码从我的RSS订阅来检索上面Blog提交的数据,然后把每个订阅项当作.NET对象操作。

uploads/200708/07_213003_step6.gif


需要注意的是我是怎样将RSS里“pubDate”字段由string类型转换为DateTime类型的。

我接下来写一点稍微复杂的东西,要在结果中执行二次查询,我要查询最近7天发表的Blog,代码如下:

放在一起做一个简单的RSS阅读器


通过我前面的代码,大家可以看到编写LINQ to XML代码检索RSS本地订阅、远程订阅是非常方便的,我可以把检索的结果绑定到ASP.NET的GridView控件或者ListView控件来提供一个非常不错的RSS订阅器:

uploads/200708/07_225837_step7.gif

总结

LINQ to XML提供了非常强大高效的方式来查询,过滤,处理XML数据。即可以访问本地XML内容,也可以访问远端XML订阅。你可以用它轻松将XML数据转化成.NET对象和集合,然后进行更进步一的操作。

参考:
主要内容来自Using LINQ to XML (and how to build a custom RSS Feed Reader with it) by ScottGu

posted on 2007-08-07 23:26  LoongTsui  阅读(1923)  评论(8编辑  收藏  举报

导航