Linq初级班 Linq To XML体验(编程)
首先,我们在Linq初级班 Linq To XML体验(基础)已经初步了解了一些XML的基本知识,在本章我们将试着用LINQ to XML对XML文档进行操作,我也是LINQ的初学者,文章中不免会有一些不对的地方,希望高手们多多指点,为我们LINQ初学者们多提宝贵的意见,我也会继续努力的,在本章我们将学习如何用LINQ to XML创建,加载,操作以及遍历XML文档,文章目录如下所示:
目录1.使用Linq to XML加载XML文档
2.使用Linq to XML创建保存XML
3.使用Linq to XML遍历XML
4.使用Linq to XML操作XML的元素
5.使用Linq to XML操作XML的属性
1.使用Linq to XML加载XML文档
首先在工程下创建好一个XML文档,命名为test.xml,内容如下:
代码
<?
xml version="1.0" encoding="utf-8"
?>
<? xml-stylesheet title='黄聪' ?>
< Root >
< Persons >
< Person Id ="1" >
< Name > Huang Cong </ Name >
< Sex > 男 </ Sex >
</ Person >
</ Persons >
</ Root >
<? xml-stylesheet title='黄聪' ?>
< Root >
< Persons >
< Person Id ="1" >
< Name > Huang Cong </ Name >
< Sex > 男 </ Sex >
</ Person >
</ Persons >
</ Root >
测试程序:
代码
//
-----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黄聪 , Ltd .
// -----------------------------------------------------------
using System;
using System.Xml.Linq;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 从xml文件中加载
XElement xel1 = XElement.Load( " test.xml " );
Console.WriteLine( " 从xml文件中加载: " );
Console.WriteLine(xel1);
Console.WriteLine( " --------------------------------- " );
// 从字符串中加载
XElement xel2 = XElement.Parse( @"
<Root>
<Persons>
<Person Id='1'>
<Name>Huang Cong</Name>
<Sex>男</Sex>
</Person>
</Persons>
</Root> " );
Console.WriteLine( " 从字符串中加载: " );
Console.WriteLine(xel2);
Console.WriteLine( " --------------------------------- " );
// 从TextReader中加载
TextReader tr = new StringReader( @"
<Root>
<Persons>
<Person Id='1'>
<Name>Huang Cong</Name>
<Sex>男</Sex>
</Person>
</Persons>
</Root> " );
XElement xel3 = XElement.Load(tr);
Console.WriteLine( " 从TextReader中加载: " );
Console.WriteLine(xel3);
Console.WriteLine( " --------------------------------- " );
}
}
}
// All Rights Reserved , Copyright (C) 2010 ,黄聪 , Ltd .
// -----------------------------------------------------------
using System;
using System.Xml.Linq;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 从xml文件中加载
XElement xel1 = XElement.Load( " test.xml " );
Console.WriteLine( " 从xml文件中加载: " );
Console.WriteLine(xel1);
Console.WriteLine( " --------------------------------- " );
// 从字符串中加载
XElement xel2 = XElement.Parse( @"
<Root>
<Persons>
<Person Id='1'>
<Name>Huang Cong</Name>
<Sex>男</Sex>
</Person>
</Persons>
</Root> " );
Console.WriteLine( " 从字符串中加载: " );
Console.WriteLine(xel2);
Console.WriteLine( " --------------------------------- " );
// 从TextReader中加载
TextReader tr = new StringReader( @"
<Root>
<Persons>
<Person Id='1'>
<Name>Huang Cong</Name>
<Sex>男</Sex>
</Person>
</Persons>
</Root> " );
XElement xel3 = XElement.Load(tr);
Console.WriteLine( " 从TextReader中加载: " );
Console.WriteLine(xel3);
Console.WriteLine( " --------------------------------- " );
}
}
}
运行结果:
2.使用Linq to XML创建保存XML
Linq to XML提供了一组简单而强大的方法来手工创建XML元素,在Linq初级班 Linq To XML体验(基础)中也有所演示了,需要注意的是,Linq to XML提供了自动缩进功能,这使得可读性很强,下面就演示如何用单个语句来创建一个XML树.此外使用Linq to XML保存XML和加载XML一样简单,使用Save()方法可以将XML写入一个test.xml文件中.这种保存XML的方法通常也叫做序列化.
代码
//
-----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黄聪 , Ltd .
// -----------------------------------------------------------
using System;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 保存
XElement xel1 = XElement.Parse( @"
<Root>
<Persons>
<Person Id='1'>
<Name>Huang Cong</Name>
<Sex>男</Sex>
</Person>
</Persons>
</Root> " );
// 保存至test1.xml文档中
xel1.Save( " test1.xml " );
XElement xel2 = new XElement(
new XElement( " Root " ,
new XElement( " Child1 " , 1 ),
new XElement( " Child2 " , 2 ))
);
// 保存至test2.xml文档中
xel2.Save( " test2.xml " );
}
}
}
// All Rights Reserved , Copyright (C) 2010 ,黄聪 , Ltd .
// -----------------------------------------------------------
using System;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 保存
XElement xel1 = XElement.Parse( @"
<Root>
<Persons>
<Person Id='1'>
<Name>Huang Cong</Name>
<Sex>男</Sex>
</Person>
</Persons>
</Root> " );
// 保存至test1.xml文档中
xel1.Save( " test1.xml " );
XElement xel2 = new XElement(
new XElement( " Root " ,
new XElement( " Child1 " , 1 ),
new XElement( " Child2 " , 2 ))
);
// 保存至test2.xml文档中
xel2.Save( " test2.xml " );
}
}
}
运行结果:
3.使用Linq to XML遍历XML
代码
//
-----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黄聪 , Ltd .
// -----------------------------------------------------------
using System;
using System.Xml.Linq;
using System.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 保存
XElement xel = XElement.Parse( @"
<Root>
<Persons>
<Person>Huang Cong</Person>
<Person>Zhang San</Person>
<Person>Li Si</Person>
<Person>Wang Wu</Person>
</Persons>
</Root> " );
Console.WriteLine( " 使用XNode遍历: " );
foreach (XNode n in xel.Nodes())
{
Console.WriteLine(n);
}
Console.WriteLine( " ---------------------------- " );
Console.WriteLine( " 使用XElement遍历: " );
foreach (XElement e in xel.Elements( " Persons " ))
{
Console.WriteLine(e);
}
Console.WriteLine( " ---------------------------- " );
Console.WriteLine( " 使用Lambda表达式遍历: " );
var query = xel.Elements().Select(u => u);
foreach (var q in query)
{
Console.WriteLine(q);
}
}
}
}
// All Rights Reserved , Copyright (C) 2010 ,黄聪 , Ltd .
// -----------------------------------------------------------
using System;
using System.Xml.Linq;
using System.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 保存
XElement xel = XElement.Parse( @"
<Root>
<Persons>
<Person>Huang Cong</Person>
<Person>Zhang San</Person>
<Person>Li Si</Person>
<Person>Wang Wu</Person>
</Persons>
</Root> " );
Console.WriteLine( " 使用XNode遍历: " );
foreach (XNode n in xel.Nodes())
{
Console.WriteLine(n);
}
Console.WriteLine( " ---------------------------- " );
Console.WriteLine( " 使用XElement遍历: " );
foreach (XElement e in xel.Elements( " Persons " ))
{
Console.WriteLine(e);
}
Console.WriteLine( " ---------------------------- " );
Console.WriteLine( " 使用Lambda表达式遍历: " );
var query = xel.Elements().Select(u => u);
foreach (var q in query)
{
Console.WriteLine(q);
}
}
}
}
运行结果:
4.使用Linq to XML操作XML的元素
Linq to XML可以方便地修改XML树,如添加,删除,更新和复制XML文档的内容其中包括:
1.插入:使用XNode类中的某一种添加方法可以很容易地向一个XML树添加内容.(AddAfterSelf,AddBeforeSelf)
2.更新:使用LINQ to XML更新XML相当简单.(ReplaceWith)
3.删除:使用LINQ to XML删除XML只要导航到要删除的内容调用删除方法即可.(Remove,RemoveAll)
(1)插入元素
代码
//
-----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黄聪 , Ltd .
// -----------------------------------------------------------
using System;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 保存
XElement xel = new XElement( new XElement( " Root " ,
new XElement( " Person " ,
new XElement( " Name " , " Huang Cong " ))));
// 在Hang Cong之前插入一个元素
xel.Element( " Person " ).Element( " Name " ).AddBeforeSelf( new XElement( " Sex " , " 男 " ));
// 在Hang Cong之后插入一个元素
xel.Element( " Person " ).Element( " Name " ).AddAfterSelf( new XElement( " Age " , 22 ));
Console.WriteLine(xel);
}
}
}
// All Rights Reserved , Copyright (C) 2010 ,黄聪 , Ltd .
// -----------------------------------------------------------
using System;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 保存
XElement xel = new XElement( new XElement( " Root " ,
new XElement( " Person " ,
new XElement( " Name " , " Huang Cong " ))));
// 在Hang Cong之前插入一个元素
xel.Element( " Person " ).Element( " Name " ).AddBeforeSelf( new XElement( " Sex " , " 男 " ));
// 在Hang Cong之后插入一个元素
xel.Element( " Person " ).Element( " Name " ).AddAfterSelf( new XElement( " Age " , 22 ));
Console.WriteLine(xel);
}
}
}
运行结果:
(2)更新元素
代码
//
-----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黄聪 , Ltd .
// -----------------------------------------------------------
using System;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 保存
XElement xel = new XElement( new XElement( " Root " ,
new XElement( " Person " ,
new XElement( " Name " , " Huang Cong " ),
new XElement( " Sex " , " 男 " ),
new XElement( " Age " , 22 ))));
// 更新某个元素
xel.Element( " Person " ).Element( " Name " ).ReplaceWith( new XElement( " Name " , " Li Si " ));
Console.WriteLine(xel);
Console.WriteLine( " -------------------------- " );
// 更新一个元素以及子节点
xel.Element( " Person " ).ReplaceWith( new XElement( " Person " ,
new XElement( " Name " , " Zhang San " ),
new XElement( " Sex " , " 女 " ),
new XElement( " Age " , 23 )));
Console.WriteLine(xel);
}
}
}
// All Rights Reserved , Copyright (C) 2010 ,黄聪 , Ltd .
// -----------------------------------------------------------
using System;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 保存
XElement xel = new XElement( new XElement( " Root " ,
new XElement( " Person " ,
new XElement( " Name " , " Huang Cong " ),
new XElement( " Sex " , " 男 " ),
new XElement( " Age " , 22 ))));
// 更新某个元素
xel.Element( " Person " ).Element( " Name " ).ReplaceWith( new XElement( " Name " , " Li Si " ));
Console.WriteLine(xel);
Console.WriteLine( " -------------------------- " );
// 更新一个元素以及子节点
xel.Element( " Person " ).ReplaceWith( new XElement( " Person " ,
new XElement( " Name " , " Zhang San " ),
new XElement( " Sex " , " 女 " ),
new XElement( " Age " , 23 )));
Console.WriteLine(xel);
}
}
}
运行结果:
(3)删除元素
代码
//
-----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黄聪 , Ltd .
// -----------------------------------------------------------
using System;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 保存
XElement xel = new XElement( new XElement( " Root " ,
new XElement( " Person " ,
new XElement( " Name " , " Huang Cong " ),
new XElement( " Sex " , " 男 " ),
new XElement( " Age " , 22 ))));
// 从父节点删除该元素,包括该元素下的所有子节点
xel.Element( " Person " ).Element( " Sex " ).Remove();
Console.WriteLine(xel);
Console.WriteLine( " -------------------------- " );
// 删除某个元素下的所有子节点
xel.Element( " Person " ).RemoveAll();
Console.WriteLine(xel);
}
}
}
// All Rights Reserved , Copyright (C) 2010 ,黄聪 , Ltd .
// -----------------------------------------------------------
using System;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 保存
XElement xel = new XElement( new XElement( " Root " ,
new XElement( " Person " ,
new XElement( " Name " , " Huang Cong " ),
new XElement( " Sex " , " 男 " ),
new XElement( " Age " , 22 ))));
// 从父节点删除该元素,包括该元素下的所有子节点
xel.Element( " Person " ).Element( " Sex " ).Remove();
Console.WriteLine(xel);
Console.WriteLine( " -------------------------- " );
// 删除某个元素下的所有子节点
xel.Element( " Person " ).RemoveAll();
Console.WriteLine(xel);
}
}
}
运行结果:
5.使用Linq to XML操作XML的属性
代码
//
-----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黄聪 , Ltd .
// -----------------------------------------------------------
using System;
using System.Xml.Linq;
using System.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 创建XML树的时候添加几个属性
XElement xel = new XElement( new XElement( " Root " ,
new XElement( " Person " ,
new XAttribute( " Name " , " Huang Cong " ),
new XAttribute( " Sex " , " 男 " ),
new XAttribute( " Age " , 22 ))));
Console.WriteLine(xel);
Console.WriteLine( " -------------------------- " );
Console.WriteLine( " 遍历某个元素的所有属性: " );
foreach (XAttribute att in xel.Element( " Person " ).Attributes())
{
Console.WriteLine(att);
}
Console.WriteLine( " -------------------------- " );
Console.WriteLine( " 使用LINQ遍历某个元素的属性: " );
var query = xel.Element( " Person " ).Attributes().Where(a => a.Name == " Name " || a.Name == " Sex " ).Select(a => a);
foreach (var q in query)
{
Console.WriteLine(q);
}
Console.WriteLine( " -------------------------- " );
Console.WriteLine( " 获取某个元素第一个属性: " );
Console.WriteLine(xel.Element( " Person " ).FirstAttribute.Value.ToString());
Console.WriteLine( " 获取某个元素最后一个属性: " );
Console.WriteLine(xel.Element( " Person " ).LastAttribute.Value.ToString());
Console.WriteLine( " -------------------------- " );
Console.WriteLine( " 使用Remove方法删除某个属性 " );
xel.Element( " Person " ).Attribute( " Sex " ).Remove();
Console.WriteLine(xel);
Console.WriteLine( " -------------------------- " );
Console.WriteLine( " 使用SetAttributeValue方法删除某个属性 " );
xel.Element( " Person " ).SetAttributeValue( " Age " , null );
Console.WriteLine(xel);
Console.WriteLine( " -------------------------- " );
}
}
}
// All Rights Reserved , Copyright (C) 2010 ,黄聪 , Ltd .
// -----------------------------------------------------------
using System;
using System.Xml.Linq;
using System.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 创建XML树的时候添加几个属性
XElement xel = new XElement( new XElement( " Root " ,
new XElement( " Person " ,
new XAttribute( " Name " , " Huang Cong " ),
new XAttribute( " Sex " , " 男 " ),
new XAttribute( " Age " , 22 ))));
Console.WriteLine(xel);
Console.WriteLine( " -------------------------- " );
Console.WriteLine( " 遍历某个元素的所有属性: " );
foreach (XAttribute att in xel.Element( " Person " ).Attributes())
{
Console.WriteLine(att);
}
Console.WriteLine( " -------------------------- " );
Console.WriteLine( " 使用LINQ遍历某个元素的属性: " );
var query = xel.Element( " Person " ).Attributes().Where(a => a.Name == " Name " || a.Name == " Sex " ).Select(a => a);
foreach (var q in query)
{
Console.WriteLine(q);
}
Console.WriteLine( " -------------------------- " );
Console.WriteLine( " 获取某个元素第一个属性: " );
Console.WriteLine(xel.Element( " Person " ).FirstAttribute.Value.ToString());
Console.WriteLine( " 获取某个元素最后一个属性: " );
Console.WriteLine(xel.Element( " Person " ).LastAttribute.Value.ToString());
Console.WriteLine( " -------------------------- " );
Console.WriteLine( " 使用Remove方法删除某个属性 " );
xel.Element( " Person " ).Attribute( " Sex " ).Remove();
Console.WriteLine(xel);
Console.WriteLine( " -------------------------- " );
Console.WriteLine( " 使用SetAttributeValue方法删除某个属性 " );
xel.Element( " Person " ).SetAttributeValue( " Age " , null );
Console.WriteLine(xel);
Console.WriteLine( " -------------------------- " );
}
}
}
运行结果: