LINQ to XML并不打算替代标准的XML API,例如,XML DOM(Document Object Model)、Path、XQuery和XSLT等。如果熟悉这些API或当前需要使用或学习它们,可以继续使用或学习。LINQ to XML补充了这些标准XML类,更便于使用XML。LINQ to XML为创建和查询XML据提供了额外的选项,代码更简单,开发许多常见的情形时速度更快,如果已经在其他程序中使了LINQ,开发速度将会更快。

要使linq操作Xml 必须引入using System.Xml.Linq;命名空间

下面我们比较几个创建xml文档的方法:

1:传统运用xml api创建xml

public void GeneratorXmlFile()
{
string filePath = "../../xmlFile.xml";
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(filePath); //load xml file XmlElement root = xmldoc.DocumentElement; //get root element XmlNode node = root.LastChild; //get last node
int number = int.Parse(node.ChildNodes[0].InnerText.ToString()); //get id of last node XmlElement customers = xmldoc.CreateElement("customers"); //create new element
XmlElement customer = xmldoc.CreateElement("custom");
XmlElement customerId = xmldoc.CreateElement("id");
XmlElement customerName = xmldoc.CreateElement("name");
XmlElement customerAge = xmldoc.CreateElement("age"); customerId.InnerText =( number+1).ToString(); //number plus q
customerName.InnerText = "fj";
customerAge.InnerText = "22"; customer.AppendChild(customerId); //append child
customer.AppendChild(customerName);
customer.AppendChild(customerAge);
root.InsertAfter(customer,root.LastChild); //append to root
xmldoc.Save(filePath); //save file
}

  2.利用XDocment参数列表的方式

public void GeneratorAXmlDoc()
{
XDocument xdoc = new XDocument(
new XElement("customers",
new XElement("custome",
new XAttribute("color","red"),
new XAttribute("size","18px"),
new XElement("id",1
)
),
new XElement("custome",
new XAttribute("color", "black"),
new XAttribute("size", "30px"),
new XElement("id", 2
)
)
)
);
string filePath = "../../linqXml.xml";
if (!File.Exists(filePath))
{
File.Create(filePath);
} xdoc.Save(filePath);
}

  3.利用XDocument.parse静态方法

 public void GeneratorAXmlByXmlDocParse()
{
XDocument xDoc = XDocument.Parse
(@"<?xml version=""1.0"" encoding=""utf-8""?>
<customers>
<custome color=""red"" size=""18px"">
<id>1</id>
</custome>
<custome color=""black"" size=""30px"">
<id>2</id>
</custome>
</customers>" );
Console.WriteLine(xDoc); //save an red function is the same as GeneratorAXmlDoc and ReadLinqXmlfile
}

  后两种方法的读取方法如下:

   public void ReadLinqXmlFile()
{
XDocument xdoc = XDocument.Load("../../linqXml.xml");
Console.WriteLine(xdoc);
}

  比较着三种方法,很显然用linq操作xml是很方便的。

另外在linq中海能操作代码片段,能够导出数据库的数据成xml格式

例子如下:

1.创建代码片段,正常情况下,我们的xml都是从xmldoucment开始的,但是在linq中,可以从xelement开始

     //  一般创建方式
public void GeneratorXml()
{
XElement xele = new XElement("customers",
new XElement("customer",
new XAttribute("id", "1"),
new XAttribute("city", "beijing")
) );
Console.WriteLine(xele);
}

2,从数据库导出xml

值得注意的是,这是两张表的联动,第一张customer表记录的是客户的一般信息,order表记录的是客户的订单情况,他们用customid作为主外键建立外键关系

XElement xele = new XElement ("customers",

from c in study.Customer.AsEnumerable()
                         select new XElement("customer",
                         new XAttribute("id",c.CustomerID),.......

为什么可以这样写??

对比上面一般创建xml的方法,我们可以发现,XElement xele=new XElement(param1,param2,......)这是一种用参数列表创建xml文件 ,还记得这样的形似吗?

varchar result=from item in datalist select new(a=item.id,b=item,name);

foreach(var i in result){

console.writeline(i); //这个会输出什么?? {a=4,b=hihi}  ,这就是var自己推断类型

}

我们先不妨将上面简化一下,改成只有一张表的

  XElement x = new XElement("customers",
                from c in study.Customer
                select new XElement("customer", c.Order)
                ); 这里只有一张表,而且只有两层(customers,customer)
这里因为在new 后又xElement 也就是说这就匿名类的类型是确认的,是一个xelement,
from c in study.Customer select new XElement("customer", c.Order) 改行的结果:<customer>c.order(确定的值)</customer>
在类型确定的情况下,把上面结果也就是一个element替换上面表达式linq部分,就是简单的 XElement x = new XElement("customers",<customer......./>)
同理,在两层表时也一样
public void test()
{
studyEntities2 study = new studyEntities2(); XElement xele = new XElement ("customers",
from c in study.Customer.AsEnumerable()
select new XElement("customer",
new XAttribute("id",c.CustomerID),
new XAttribute("city",c.City),
new XElement("orders",
// from d in study.Order.AsEnumerable()
//where d.CustomerID==c.CustomerID 这两种方法都可以。因为在 customer表和order表以customId作为外键,from d in c.Order
from d in c.Order
select new XElement("order",
new XAttribute("id",d.ID),
new XAttribute("orderdata",d.OrderDate),
d.ShipName
)

) );
string filePath = "../../xmlFromDataBase.xml";
xele.Save(filePath); //不存在会自己创建 XElement element = XElement.Load(filePath);
Console.WriteLine(element); // Console.WriteLine(xele);
}

  值得注意的是:上面从数据库导出xml还有很多地方值得我们去推敲:

1.from c in study.Customer.AsEnumerable()

其中的AsEnumerable()是干嘛的呢?

书上解曰:    LINQ to Entities查询把Northwind数据上下文对象的Customers成员作为数据源,通过Customers、Orders和Order Details表生成包含了所有顾客订单的列表。但是,由于LINQ to Entities查询的延迟执行,我们使用Customer对象上的AsEnumerable()方法把中间结果转换为内存中的LINQ to Objects可枚举类型。最后,查询结果被投影到查询的select子句中,成为一组嵌套的LINQ to XML元素和特性。

也就是说,linq to entities 是即查即用的,子查询不能利用父查询,通过AsEnumerable()将中间结果保存在内存中,方便子查询。如果除掉会报错

2.   from d in study.Order.AsEnumerable()  where d.CustomerID==c.CustomerID 
      from d in c.Order

这两种方法都可以。因为在 customer表和order表以customId作为外键。通过from d in c.Order  可以建立customer和order主外键的关系,通过他们,可以选择出所有customerId对应的order表中的数据

Linq学习<四> linq to XML的更多相关文章

  1. [LINQ2Dapper]最完整Dapper To Linq框架(四)---Linq和SQL并行使用

    目录 [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询 [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询 [LINQ2Dapp ...

  2. Linq学习笔记---Linq to Xml操作

    LINQ to XML的成员, 属性列表: 属性 说明 Document 获取此 XObject 的 XDocument  EmptySequence  获取空的元素集合  FirstAttribut ...

  3. Linq学习总结2--Linq to XML

    概述: linq to xml(下面简称ltx好了),是微软根据linq技术对于XML的CURD.使用起来比System.XML中的XML操作方式更加简便.这段时间使用它在公司里升级了老板的邮件系统, ...

  4. Linq学习(四)-联合查询

    一.本将主要介绍 Union.Concat.Intersect.Except的使用操作 1.Union 查询昵称中带有Friend和带有Lee的用户 Linq (from a in Blog_User ...

  5. Linq学习<三> linq to entity

    之前一直用sql选择出数据放在一个集合中,然后再用Linq或者lambda去操作数据,今天学了Linq to entity 才知道原来linq产生是为了Entity.也就是EDM(实体数据模型) 关于 ...

  6. Linq学习笔记---Linq to Sql之where

    http://kb.cnblogs.com/page/42465/ Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断 ...

  7. LINQ to XML LINQ学习第一篇

    LINQ to XML LINQ学习第一篇 1.LINQ to XML类 以下的代码演示了如何使用LINQ to XML来快速创建一个xml: public static void CreateDoc ...

  8. XML系列之--Linq操作带属性的XML(四)

    关于XML,之前解析过电文收发方面的,就是所谓的带表头.前缀(命名空间)SOAP格式.这次需求是解析一个xml的模板(xls内容),然后填充数据,最后保存.需要时可转换xls.pdf等文件.关于这种带 ...

  9. Linq学习(一)-初涉Linq

    一.何谓LINQ LINQ:Language Integrated Query语言集成查询,其本质是对ADO.NET结果集通过反射连同泛型特性转换成对象集,实现OR模型的转换 二.优点与缺点 优点:封 ...

随机推荐

  1. [转]第一次使用Android Studio时你应该知道的一切配置(三):gradle项目构建

    目录: 1.gradle的概念 2.gradle配置jar包,和libs文件夹导入jar包的区别 3.签名打包: (1)Studio (2)命令行 (3)gradle wrapper的原理 4.Bui ...

  2. node中一个基本的HTTP客户端向本地的HTTP服务器发送数据

    上一篇讲到了node可以轻松的向其他请求数据. 这一篇就来讲讲向本地服务器的数据交互. HTTP服务器代码,s.js var http=require("http"); var s ...

  3. java类继承总结一 父类类型与子类类型之间的转化问题(转)

    java类继承总结一 父类类型与子类类型之间的转化问题 本文将通过一个实例描述父类类型与子类类型之间的转化问题,这个很特殊的问题常常会导致一些潜在的危险,让你整整一个晚上都在调试程序以解决一个让人抓狂 ...

  4. 实例演示oracle数据块状态视图v$bh的用法二 热点块问题(转)

    在实例一中,我们读取到了x$bh中的tch字段,该字段表示的该字段被读取/写入的次数,这个值在oracle的LRU算法中,是一个重要的参数,如果这个字段被访问,则该值就会增加: 1,第一次查看TCH的 ...

  5. apache 自定义404错误页面

    1.有些提供web服务的网站,在用户访问一个不存在的网站文件时,会提示404错误,如下所示: 现在要求自定义一个错误页面,也就是出现404错误代码时,跳转到我们自定义的网址上.下面记录下方法: 1.编 ...

  6. SharePoint 事件 7363:对象缓存:缓存使用的超级读者帐户没有足够的权限访问SharePoint数据库。

    转自MSND:http://technet.microsoft.com/zh-cn/library/ff758656(v=office.14) 对象缓存存储 Microsoft SharePoint ...

  7. Django模型层

    ORM简介: MVC或者MTV框架中包括一个重要的部分就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工 ...

  8. python装饰器注意事项

    内容: 1.装饰器基本结构复习 2.装饰器注意事项 python装饰器详细内容:http://www.cnblogs.com/wyb666/p/8748102.html 1.装饰器基本结构复习 装饰器 ...

  9. django Chinese

    http://usyiyi.cn/translate/django_182/contents.html

  10. MonkeyScript测试命令集合

    MonkeyScript:(不支持截屏) 可以被Monkey识别的集合命令 可以完成重复固定的操作   MonkeyRunner(支持截屏操作) 提供一系列API,可以完成模拟事件和截屏操作   Mo ...