LINQ to XMLb!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
是一种启用了 LINQ 的内存 XML 编程接口,使用它,可以在 .NET Frameworkb!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
编程语言中处理b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
XML b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
  它将 XML 文档置于内存中,这一点很像文档对象模型 (DOM)b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
您可以查询和修改 XML 文档,修改之后,可以将其另存为文件,也可以将其序列化然后通过网络发送。b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
但是,LINQ to XML DOM 不同:b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
它提供一种新的对象模型,这是一种更轻量的模型,使用也更方便,这种模型利用了 Visual C# 2008 在语言方面的改进。 b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
LINQ to XML 最重要的优势是它与 Language-Integrated Query (LINQ) 的集成。b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
由于实现了这一集成,因此,可以对内存 XML 文档编写查询,以检索元素和属性的集合。 LINQ to XML 的查询功能在功能上(尽管不是在语法上) XPath XQuery 具有可比性。 Visual C# 2008 集成 LINQ 后,可提供更强的类型化功能、编译时检查和改进的调试器支持。b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
  通过将查询结果用作 XElement XAttribute 对象构造函数的参数,实现了一种功能强大的创建 XML 树的方法。b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
这种方法称为函数构造,利用这种方法,开发人员可以方便地将 XML 树从一种形状转换为另一种形状。b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
LINQ to XML 提供了改进的 XML 编程接口,这一点可能与 LINQ to XML LINQ 功能同样重要。b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
通过 LINQ to XML,对 XML 编程时,您可以实现任何预期的操作,包括:b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
·b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
  从文件或流加载 XML b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
·b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
  将 XML 序列化为文件或流。 b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
·b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
  使用函数构造从头开始创建 XML b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
·b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
  使用类似 XPath 的轴查询 XML b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
·b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
  使用 AddRemoveReplaceWith SetValue 等方法对内存 XML 树进行操作。 b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
·b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
  使用 XSD 验证 XML 树。 b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
·b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
  使用这些功能的组合,可将 XML 树从一种形状转换为另一种形状。b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
好了,我开始废话,首先说一下呢,我技术平平,写出来的文章自然也是不怎么高水平的,但是都是我自己实际项目中总结出来的。b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
错误之处还请大家指正,转载的朋友请注明出处:
『半途』b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
现在言归正传说我们的正题b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
首先我们创建一个新窗体,这里以我的网站为例,我们起名叫Rss.aspxb!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
创建完成后,如果Rss数据源是XML实际文档,就跳过下面一步,如果Rss数据源是aspx文件b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
请在创建完新页面后切换到源视图b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
保留这一行:b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Rss.aspx.cs" Inherits="Rss" %>b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
其余的html代码全部删除b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
然后在cs里创建方法createRss()b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
具体看代码和注释:b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

public void createRss()

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
{

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
//
首先从数据库里读出所需要的数据

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
XXXXContext bd = new XXXXContext();

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
var sq = from p in bd.news orderby p.ID descending select new { p.ID, p.title,p.cont, p.in_date,p.n_type };

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
//
开始创建xmlb!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
对于Rss的规范我这里不再啰嗦了,不明白的可以去网上查一下

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
//
下面这一部分为xml里的声明部分,从foreach开始循环item,把sq的数据循环写入xml

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
XElement contacts = new XElement("rss", new XAttribute("version", "2.0"),

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
new XElement("channel",

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
new XElement("title", "
半途的Rss"),

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
new XElement("link", "http://www.bantool.cn"),

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
new XElement("description", "C#,linq,vs2008"),

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
new XElement("language", "zh_cn"),

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
new XElement("copyright", "Copyright 2008 bantool"),

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
new XElement("webMaster", "ziie@tom.com")));

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
//
这里开始循环写数据

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
foreach (var p in sq)

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
{

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
contacts.Element("channel").Add(new XElement("item",

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
new XElement("title", p.title),

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
new XElement("link", "http://www.bantool.cn/news" + p.ID + ".bantool"),

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
new XElement("description", p.cont),

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
new XElement("category", p.n_type),

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
new XElement("pubDate", p.in_date)));

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
}

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
//
这里开始操作xml是写入具体的xml文件还是直接输出

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
//
如果是写入文件的话用这个

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
//contacts.Save("
文件路径");

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
//
如果是输出的諙,

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
//
先设好输出的类型"text/xml"

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
Response.ContentType = "text/xml";

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
using (XmlWriter writer = new XmlTextWriter(Response.OutputStream, Encoding.UTF8))

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
//
用contacts的WriteTo方法来写

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
contacts.WriteTo(writer);

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
//
这样就OK啦

b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
}b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>
b!,á¸êv8www.netcsharp.cnÆ љ¬¡é>