C# LINQ to XML应用介绍

 更新时间:2012年11月21日 10:55:57   作者:  
.Net又引入了LINQ,于是LINQ to XML也就应运而生,所以在.Net中,不仅可以用W3C XML DOM标准,还可以使用LINQ to XML来操作XML文档。下面就来简单介绍一下如何使用LINQ to XML
W3C制定了XML DOM标准,.Net为了支持W3C的标准,从1.1版本开始就引入了XmlDocument类。我在前一篇博客中,介绍了如何使用XmlDocument类来对XML文档进行操作。后来 .Net又引入了LINQ,于是LINQ to XML也就应运而生,所以在.Net中,不仅可以用W3C XML DOM标准,还可以使用LINQ to XML来操作XML文档。下面就来简单介绍一下如何使用LINQ to XML。
(一) 加载
加载XML比较常用的有三种方法:
复制代码 代码如下:

public static XDocument Load(string uri);
public static XDocument Load(Stream stream);
public static XDocument Parse(string text);

下面代码演示如何使用它们:
复制代码 代码如下:

// public static XDocument Load(string uri);
// uri 即为要装载的文件名
var doc1 = XDocument.Load("XMLFile1.xml");
// public static XDocument Load(Stream stream);
Entity retrievedAnnotation = _orgService.Retrieve("annotation"
, new Guid("C1B13C7F-F430-E211-8FA1-984BE1731399"), new ColumnSet(true));
byte[] fileContent = Convert.FromBase64String(retrievedAnnotation["documentbody"].ToString());
MemoryStream ms = new MemoryStream(fileContent);
XDocument xDoc = XDocument.Load(ms);
// public static XDocument Parse(string text);
string str = @"<Customers><Customer id='01' city='Beijing' country='China' name='Lenovo'/></Customers>";
var doc2 = XDocument.Parse(str);

(二) 查询
我们以下面的XML文档为例:
复制代码 代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<Customers>
<Customer id="01" city="Beijing" country="China">Lenovo
<Order OrderID="1001" Freight="36.00" />
<Order OrderID="1003" Freight="61.50" />
</Customer>
<Customer id="02" city="Amsterdam" country="The Netherlands">Shell
<Order OrderID="1002" Freight="56.65" />
<Order OrderID="1004" Freight="65.50" />
<Order OrderID="1005" Freight="100.50" />
</Customer>
</Customers>

1. 返回所有Customer 节点:
复制代码 代码如下:

var result = from customer in doc1.Descendants("Customer")
select customer.Value;
foreach (var s in result)
{
Console.WriteLine(s);
}

输出结果:
Lenovo
Shell
2. 返回id为02并且 city 为 Amsterdam 的customer :
复制代码 代码如下:

var result = (from customer in doc1.Descendants("Customer")
where (string)customer.Attribute("id") == "02" && (string)customer.Attribute("city") == "Amsterdam"
select customer.Value).FirstOrDefault();
Console.WriteLine(result);

输出结果:
Shell
3. 查找出 order ID 1003的customer ID和它的freight:
复制代码 代码如下:

var result = (from order in doc1.Descendants("Order")
where order.Attribute("OrderID").Value == "1003"
select new
{
CustomerID = order.Parent.Attribute("id").Value,
Freight = (decimal)order.Attribute("Freight")
}).FirstOrDefault();
Console.WriteLine(string.Format("Customer ID: {0} Freight: {1}", result.CustomerID, result.Freight));

输出结果:
Customer ID: 01 Freight: 61.50
4. 查询每个客户的freight的总和
复制代码 代码如下:

var result = from customer in doc1.Descendants("Customer")
select new
{
CustomerName = customer.Value,
TotalFreight = customer.Descendants("Order").Sum(o => (decimal)o.Attribute("Freight"))
};
foreach (var r in result)
{
Console.WriteLine(string.Format("Customer: {0} Total Freight: {1}", r.CustomerName, r.TotalFreight));
}

输出结果:
Customer: Lenovo Total Freight: 97.50
Customer: Shell Total Freight: 222.65
5. 使用LINQ to XML Join
Join可以用在LINQ to XML和其他的LINQ providers,比如说LINQ to Objects。下面的代码展示了如何将一个数组和一个XML文件Join起来。
复制代码 代码如下:

string[] orders = {"1001", "2000", "1002"};
var result = from order in doc1.Descendants("Order")
join selected in orders
on (string)order.Attribute("OrderID") equals selected
select new
{
CustomerName = order.Parent.Value,
OrderID = selected,
Freight = (decimal)(order.Attribute("Freight"))
};
foreach (var r in result)
{
Console.WriteLine(string.Format("Customer ID: {0} Order:{1} Freight: {2}", r.CustomerName, r.OrderID, r.Freight));
}

输出结果:
Customer ID: Lenovo Order:1001 Freight: 36,00
Customer ID: Shell Order:1002 Freight: 56,65
(三) 创建
以创建以下XML文档为例:
复制代码 代码如下:

<?xml version="1.0" encoding="utf-8"?>
<Customers>
<Customer id="01" city="Beijing" country="China" name="Lenovo">
<Order OrderID="1001" Freight="36.00" />
</Customer>
</Customers>

复制代码 代码如下:

var doc = new XDocument(
new XElement("Customers",
new XElement("Customer",
new XAttribute("id", "01"),
new XAttribute("city", "Beijing"),
new XAttribute("country", "China"),
new XAttribute("name", "Lenovo"),
new XElement("Order",
new XAttribute("OrderID", "1001"),
new XAttribute("Freight", "36.00")
)
)
)
);
doc.Save("test.xml");

总结:
1. XDocument提供了对XML文档在内存中的随机的读写操作。
2. XDocument使用LINQ to XML来读取XML结点。
3. 你可以通过LINQ投射(projection)来将XML变换为Object。
4. LINQ投射可以将XML变换为IEnumerable<String>。
5. LINQ投射可以将XML变换为其他格式的XML。

相关文章

  • Unity实现绕任意轴任意角度旋转向量

    Unity实现绕任意轴任意角度旋转向量

    这篇文章主要为大家详细介绍了Unity实现绕任意轴任意角度旋转向量,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01
  • C#实现任务栏通知窗口

    C#实现任务栏通知窗口

    作为程序员在享受的同时我们也不禁要问:这到底是怎么实现的呢?本文就利用Visual Studio .Net C# 2005以及.Net框架绘图技术来实现这种任务栏通知窗口。
    2015-10-10
  • unity实现按住鼠标选取区域截图

    unity实现按住鼠标选取区域截图

    这篇文章主要为大家详细介绍了unity实现按住鼠标选取区域截图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C# using的本质及使用详解

    C# using的本质及使用详解

    这篇文章主要为大家介绍了C# using的本质及使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • C#基础 延迟加载介绍与实例

    C#基础 延迟加载介绍与实例

    C#基础 延迟加载介绍与实例,有效使用它可以大大提高系统性能,需要的朋友可以参考一下
    2013-04-04
  • Winform实现将网页生成图片的方法

    Winform实现将网页生成图片的方法

    这篇文章主要介绍了Winform实现将网页生成图片的方法,类似于一般浏览器自带的网页生成图片的功能,需要的朋友可以参考下
    2014-09-09
  • 深入浅析C#泛型类型

    深入浅析C#泛型类型

    这篇文章主要介绍C#泛型类型,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • c# 实现语音聊天的实战示例

    c# 实现语音聊天的实战示例

    这篇文章主要介绍了c# 实现语音聊天的实战示例,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-02-02
  • 详解C#中的session用法

    详解C#中的session用法

    这篇文章主要介绍了C#中的session用法 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • Windows 8 Metro用C#连接SQLite及创建数据库,数据表的增删改查的实现

    Windows 8 Metro用C#连接SQLite及创建数据库,数据表的增删改查的实现

    本篇文章小编为大家介绍,Windows 8 Metro用C#连接SQLite及创建数据库,数据表的增删改查的实现。需要的朋友参考下
    2013-04-04

最新评论