虽然linq to xml随着.net framework3.0一起发布N久了,但因为自己以前参考网上的代码封装了一个xml操作类(当时linq to xml还没出来,这个封闭工具类一直也用得很顺手),所以在项目中也几乎极少用linq to xml,最近业余时间学习silverlight,原来针对winform/webform开发写的一些工具库部分要作修改才能用于silverlight,懒得一一移植了,干脆直接用.net内置的得了,何况自己再写一个,也还是这些玩意儿,有现成的不用白不用,整理了一些demo代码,贴在这里日后备用
1.简单创建xml
1
XElement xml
=
new
XElement(
"
Data
"
,
//
创建Data根节点
2 new XElement( " item " , // 创建Data下的子节点item
3 new XAttribute( " src " , " http://www.baidu.com/logo.gif " ), // 创建属性
4 new XAttribute( " url " , " http://www.baidu.com/ " )
5 ),
6 new XElement( " item " ,
7 new XAttribute( " src " , " http://www.yahoo.com.cn/logo.gif " ),
8 new XAttribute( " url " , " http://www.yahoo.com.cn/ " ),
9 new XComment( " item's comment " ), // 注释
10 new XText( " items's text " ), // 节点文本
11 new XCData( " <b>CData Test!</b> " ) // CData文本
12 ),
13 new XElement( " item " ,
14 new XElement( " sub " ,
15 new XAttribute( " type " , " string " )
16 ),
17 new XElement( " id " ,
18 new XText( " 10001 " )
19 )
20 )
21 );
22 // xml.Save(Server.MapPath("demo.xml")); // 保存为文件
2 new XElement( " item " , // 创建Data下的子节点item
3 new XAttribute( " src " , " http://www.baidu.com/logo.gif " ), // 创建属性
4 new XAttribute( " url " , " http://www.baidu.com/ " )
5 ),
6 new XElement( " item " ,
7 new XAttribute( " src " , " http://www.yahoo.com.cn/logo.gif " ),
8 new XAttribute( " url " , " http://www.yahoo.com.cn/ " ),
9 new XComment( " item's comment " ), // 注释
10 new XText( " items's text " ), // 节点文本
11 new XCData( " <b>CData Test!</b> " ) // CData文本
12 ),
13 new XElement( " item " ,
14 new XElement( " sub " ,
15 new XAttribute( " type " , " string " )
16 ),
17 new XElement( " id " ,
18 new XText( " 10001 " )
19 )
20 )
21 );
22 // xml.Save(Server.MapPath("demo.xml")); // 保存为文件
以上代码将创建以下内容的xml,基本上xml的各种元素都用到了
1
<?
xml version="1.0" encoding="utf-8"
?>
2 < Data >
3 < item src ="http://www.baidu.com/logo.gif" url ="http://www.baidu.com/" />
4 < item src ="http://www.yahoo.com.cn/logo.gif" url ="http://www.yahoo.com.cn/" >
5 <!-- item's comment --> items's text <![CDATA[ <b>CData Test!</b> ]]> </ item >
6 < item >
7 < sub type ="string" />
8 < id > 10001 </ id >
9 </ item >
10 </ Data >
2 < Data >
3 < item src ="http://www.baidu.com/logo.gif" url ="http://www.baidu.com/" />
4 < item src ="http://www.yahoo.com.cn/logo.gif" url ="http://www.yahoo.com.cn/" >
5 <!-- item's comment --> items's text <![CDATA[ <b>CData Test!</b> ]]> </ item >
6 < item >
7 < sub type ="string" />
8 < id > 10001 </ id >
9 </ item >
10 </ Data >
2.查询xml
1
XElement root
=
XElement.Load(Server.MapPath(
"
demo.xml
"
));
2
3 // 找出item元素中有属性src的节点
4 // IEnumerable<XElement> query = from c in root.Elements("item")
5 // where c.Attributes("src").Count() > 0
6 // select c;
7
8 /**/ ////当然也可以写成lambda表达式
9 // var query = root.Elements("item").Where(c => c.Attributes("src").Count() > 0);
10
11 // 如果您熟悉xpath语法,可以写得更精简,这也是我最喜欢的方式
12 var query = root.XPathSelectElements( " item[@src] " );
13
14 foreach (var item in query)
15 {
16 Response.Write(HttpUtility.HtmlEncode(item.ToString()) + "<br/>");
17}
18
19
20
21 // 找出item元素中的有属性src,且包含baidu的节点
22 // var query = from c in root.Elements("item")
23 // where c.Attributes("src").Count() > 0 && ((string)c.Attribute("src")).Contains("baidu")
24 // select c;
25
26 /**/ ////等同于以下的lambda写法
27 // var query = root.Elements("item").Where(c => c.Attributes("src").Count() > 0 && ((string)c.Attribute("src")).Contains("baidu"));
28
29 /**/ ////用xpath语法更省事
30 // var query = root.XPathSelectElements("item[@src][contains(@src,'baidu')]");
2
3 // 找出item元素中有属性src的节点
4 // IEnumerable<XElement> query = from c in root.Elements("item")
5 // where c.Attributes("src").Count() > 0
6 // select c;
7
8 /**/ ////当然也可以写成lambda表达式
9 // var query = root.Elements("item").Where(c => c.Attributes("src").Count() > 0);
10
11 // 如果您熟悉xpath语法,可以写得更精简,这也是我最喜欢的方式
12 var query = root.XPathSelectElements( " item[@src] " );
13
14 foreach (var item in query)
15 {
16 Response.Write(HttpUtility.HtmlEncode(item.ToString()) + "<br/>");
17}
18
19
20
21 // 找出item元素中的有属性src,且包含baidu的节点
22 // var query = from c in root.Elements("item")
23 // where c.Attributes("src").Count() > 0 && ((string)c.Attribute("src")).Contains("baidu")
24 // select c;
25
26 /**/ ////等同于以下的lambda写法
27 // var query = root.Elements("item").Where(c => c.Attributes("src").Count() > 0 && ((string)c.Attribute("src")).Contains("baidu"));
28
29 /**/ ////用xpath语法更省事
30 // var query = root.XPathSelectElements("item[@src][contains(@src,'baidu')]");
注:如果使用XPath语法,先要using System.Xml.XPath;
3.带循环的"复杂"创建节点
1
XElement root
=
new
XElement(
"
data
"
);
2
3 var _arr = " y j m y z z @ 1 2 6 . c o m " .Split( ' ' );
4
5 foreach ( string c in _arr)
6 {
7 XElement item = new XElement("item",
8 new XAttribute("value", c)
9 );
10
11 root.Add(item);
12}
2
3 var _arr = " y j m y z z @ 1 2 6 . c o m " .Split( ' ' );
4
5 foreach ( string c in _arr)
6 {
7 XElement item = new XElement("item",
8 new XAttribute("value", c)
9 );
10
11 root.Add(item);
12}
root内容如下:
1
2 < data >
3 < item value ="y" />
4 < item value ="j" />
5 < item value ="m" />
6 < item value ="y" />
7 < item value ="z" />
8 < item value ="z" />
9 < item value ="@" />
10 < item value ="1" />
11 < item value ="2" />
12 < item value ="6" />
13 < item value ="." />
14 < item value ="c" />
15 < item value ="o" />
16 < item value ="m" />
17 </ data >
2 < data >
3 < item value ="y" />
4 < item value ="j" />
5 < item value ="m" />
6 < item value ="y" />
7 < item value ="z" />
8 < item value ="z" />
9 < item value ="@" />
10 < item value ="1" />
11 < item value ="2" />
12 < item value ="6" />
13 < item value ="." />
14 < item value ="c" />
15 < item value ="o" />
16 < item value ="m" />
17 </ data >
转载请注明出自"菩提树下的杨过"http://www.cnblogs.com/yjmyzz/archive/2009/10/29/1592575.html