C#使用LINQ to XML操作XML实例

 W3C制定了XML DOM标准,.Net为了支持W3C的标准,从1.1版本开始就引入了XmlDocument类。在前一篇文章中,介绍了C#加载和查询XML的XmlDocument类使用实例。后来 .Net又引入了LINQ,于是LINQ to XML也就应运而生,所以在.Net中,不仅可以用W3C XML DOM标准,还可以使用LINQ to XML来操作XML文档。下面就来简单介绍一下如何使用LINQ to XML。

 

(一) 加载

加载XML比较常用的有三种方法:

 

 
 
  1. public static XDocument Load(string uri); 
  2.  
  3. public static XDocument Load(Stream stream); 
  4.  
  5. public static XDocument Parse(string text); 

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

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

(二) 查询

我们以下面的XML文档为例:

 
 
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <Customers>  
  3.   <Customer id="01" city="Beijing" country="China">Lenovo  
  4.     <Order OrderID="1001" Freight="36.00" />  
  5.     <Order OrderID="1003" Freight="61.50" />  
  6.   </Customer>  
  7.   <Customer id="02" city="Amsterdam" country="The Netherlands">Shell  
  8.     <Order OrderID="1002" Freight="56.65" />  
  9.     <Order OrderID="1004" Freight="65.50" />  
  10.     <Order OrderID="1005" Freight="100.50" />  
  11.   </Customer>  
  12. </Customers> 

1. 返回所有Customer 节点:

 
 
  1. var result = from customer in doc1.Descendants("Customer")  
  2.              select customer.Value;  
  3. foreach (var s in result)  
  4. {  
  5.     Console.WriteLine(s);  

输出结果:

Lenovo

Shell

2. 返回id为02并且 city 为 Amsterdam 的customer :

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

输出结果:

Shell

3. 查找出 order ID 1003的customer ID和它的freight:

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

输出结果:

Customer ID: 01 Freight: 61.50

4. 查询每个客户的freight的总和

 
 
  1. var result = from customer in doc1.Descendants("Customer")  
  2.              select new  
  3.              {  
  4.                  CustomerName = customer.Value,  
  5.                  TotalFreight = customer.Descendants("Order").Sum(o => (decimal)o.Attribute("Freight"))  
  6.              };  
  7. foreach (var r in result)  
  8. {  
  9.     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起来。

 
 
  1. string[] orders = {"1001""2000""1002"};  
  2. var result = from order in doc1.Descendants("Order")  
  3.              join selected in orders  
  4.              on (string)order.Attribute("OrderID") equals selected  
  5.              select new  
  6.              {  
  7.                  CustomerName = order.Parent.Value,  
  8.                  OrderID = selected,  
  9.                  Freight = (decimal)(order.Attribute("Freight"))  
  10.              };  
  11. foreach (var r in result)  
  12. {  
  13.     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文档为例:

 

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

 

 
 
  1. var doc = new XDocument(  
  2.     new XElement("Customers",  
  3.         new XElement("Customer",  
  4.             new XAttribute("id""01"),  
  5.             new XAttribute("city""Beijing"),  
  6.             new XAttribute("country""China"),  
  7.             new XAttribute("name""Lenovo"),  
  8.             new XElement("Order",  
  9.                 new XAttribute("OrderID""1001"),  
  10.                 new XAttribute("Freight""36.00")  
  11.             )  
  12.         )  
  13.     )  
  14. ); 
  15.  
  16. 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。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值