欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C# LINQ to XML应用介绍

程序员文章站 2023-12-06 11:31:34
w3c制定了xml dom标准,.net为了支持w3c的标准,从1.1版本开始就引入了xmldocument类。我在前一篇博客中,介绍了如何使用xmldocument类来对...
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。