C# 深入了解 Linq 对 XML 的操作

前言

       W3C制定了XML DOM标准,.Net为了支持W3C的标准,从1.1版本开始就引入了XmlDocument类。

      自从 formwork 3.5发布后 .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 = @""; 
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"); 
复制代码

 

(四) 更改

以下面的XML文档为例

复制代码
xml version="1.0" encoding="utf-8" ?> 
<Customers> 
  <Customer id="01" city="Beijing" country="China" name="Lenovo"> 
    <Contact gender="female" title="Support">Li LiContact> 
  Customer> 
  <Customer id="02" city="Amsterdam" country="The Netherlands" name="Shell"> 
    <Contact gender="male" title="Sales Person">Aaron BabbittContact> 
    <Contact gender="female" title="Sales Manager">Daisy CabellContact> 
    <Contact gender="male" title="Sales Person">Gabriel EadsContact> 
  Customer> 
Customers>
复制代码

 

1. 将Contact Li Li更改为Evi

var node = (from x in doc1.Descendants("Contact")
            where x.Value == "Li Li"
            select x).FirstOrDefault();
node.Value = "Evi";

 

2. 将id为02的Customer的city属性更改为Den Haag

var node = (from x in doc1.Descendants("Customer")
            where x.Attribute("id").Value == "02"
            select x).FirstOrDefault();
node.Attribute("city").Value = "Den Haag";


3. 将id为02的Customer的所有下属Contact的title属性更改为Functional Consultant

复制代码
var node = (from x in doc1.Descendants("Customer")
            where x.Attribute("id").Value == "02"
            select x).FirstOrDefault();
var nodelist = from x in node.Descendants("Contact")
                select x;
nodelist.ToList().ForEach(x => x.Attribute("title").Value = "Functional Consultant");
复制代码

 

(五) 删除节点

还以下面的XML文档为例

复制代码
xml version="1.0" encoding="utf-8" ?> 
<Customers> 
  <Customer id="01" city="Beijing" country="China" name="Lenovo"> 
    <Contact gender="female" title="Support">Li LiContact> 
  Customer> 
  <Customer id="02" city="Amsterdam" country="The Netherlands" name="Shell"> 
    <Contact gender="male" title="Sales Person">Aaron BabbittContact> 
    <Contact gender="female" title="Sales Manager">Daisy CabellContact> 
    <Contact gender="male" title="Sales Person">Gabriel EadsContact> 
  Customer> 
Customers>
复制代码

 

1. 删除Contact Li Li节点

var node = (from x in doc1.Descendants("Contact")
            where x.Value == "Li Li"
            select x).FirstOrDefault();
node.Remove();

结果:

复制代码
xml version="1.0" encoding="utf-8"?>
<Customers>
  <Customer id="01" city="Beijing" country="China" name="Lenovo" />
  <Customer id="02" city="Amsterdam" country="The Netherlands" name="Shell">
    <Contact gender="male" title="Sales Person">Aaron BabbittContact>
    <Contact gender="female" title="Sales Manager">Daisy CabellContact>
    <Contact gender="male" title="Sales Person">Gabriel EadsContact>
  Customer>
Customers>
复制代码


2. 删除Contact Li Li节点的父节点

var node = (from x in doc1.Descendants("Contact")
            where x.Value == "Li Li"
            select x).FirstOrDefault();
node.Parent.Remove();

 

结果:

复制代码
xml version="1.0" encoding="utf-8"?>
<Customers>
  <Customer id="02" city="Amsterdam" country="The Netherlands" name="Shell">
    <Contact gender="male" title="Sales Person">Aaron BabbittContact>
    <Contact gender="female" title="Sales Manager">Daisy CabellContact>
    <Contact gender="male" title="Sales Person">Gabriel EadsContact>
  Customer>
Customers>
复制代码

 

(六) Namespace

复制代码
xml version="1.0" encoding="utf-8" ?>
<root xmlns:h="http://www.w3.org/TR/html4/"
 xmlns:f="http://www.w3schools.com/furniture">
  <h:table>
    <h:tr>
      <h:td>Applesh:td>
      <h:td>Bananash:td>
    h:tr>
  h:table>
  <f:table>
    <f:name>African Coffee Tablef:name>
    <f:width>80f:width>
    <f:length>120f:length>
  f:table>
root>
复制代码

 

查询上面文档的第一个f:name节点

string f = @"http://www.w3schools.com/furniture";
var node = (from x in doc1.Descendants(XNamespace.Get(f) + "name")                        
            select x).FirstOrDefault();
Console.WriteLine(node.Value);


  

 IT交流互助QQ群:79190545    (Sql Server / Java / Asp.Net / C# / JS / Jquery / Oracle / My Sql / )

你可能感兴趣的:(Linq,C#,XML)