一、简介
LINQ to XML 是一种启用了 LINQ 的内存 XML 编程接口,使用它,可以在 .NET Framework 编程语言中处理 XML。 它将 XML 文档置于内存中,这一点很像文档对象模型 (DOM)。 您可以查询和修改 XML 文档,修改之后,可以将其另存为文件,也可以将其序列化然后通过网络发送。 但是,LINQ to XML 与 DOM 不同: 它提供一种新的对象模型,这是一种更轻量的模型,使用也更方便,这种模型利用了 Visual C# 2008 在语言方面的改进。
LINQ to XML 最重要的优势是它与 Language-Integrated Query (LINQ) 的集成。 由于实现了这一集成,因此,可以对内存 XML 文档编写查询,以检索元素和属性的集合。 LINQ to XML 的查询功能在功能上(尽管不是在语法上)与 XPath 和 XQuery 具有可比性。 Visual C# 2008 集成 LINQ 后,可提供更强的类型化功能、编译时检查和改进的调试器支持。
通过将查询结果用作 XElement 和 XAttribute 对象构造函数的参数,实现了一种功能强大的创建 XML 树的方法。 这种方法称为“函数构造”,利用这种方法,开发人员可以方便地将 XML 树从一种形状转换为另一种形状。
二、载入文档
可以通过XDocument或XElement的静态方法Load载入xml文档,Load可以接受URI字符串,TextReader,XmlReader作为输入源。还可以使用静态方法Parse把字符串转变为待查询的xml文档。XDocument和XElement的区别在于查询时,XElment可以跳过根几点直接查询。
//从文件载入
XDocument myPets = XDocument.Load("MyPets.xml");
//从http载入天气预报
string weatherWebService = "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName=58367";
XDocument weather = XDocument.Load(weatherWebService);
XElement weatherElement = XElement.Load(weatherWebService);
三、查询XML文档
待查询的xml文档
<?xml version="1.0" encoding="utf-8"?>
<pets>
<pet>
<id>2</id>
<name>Dog</name>
<species>Some Kind of Cat</species>
<sex>Female</sex>
<startYear>1972</startYear>
<endYear>1974</endYear>
<causeOfDeath>Car</causeOfDeath>
<specialQuality>Best mouser</specialQuality>
</pet>
<pet>
<id>3</id>
<name>Sam</name>
<species>Labrador</species>
<sex>Female</sex>
<startYear>1973</startYear>
<endYear>1980</endYear>
<causeOfDeath>Old Age</causeOfDeath>
<specialQuality>Great hunting dog</specialQuality>
</pet>
</pets>
载入文档后,XDocument或XElement的Elements()方法执行时返回IEnumrable<XElement>类型的子节点信息,Element()方法返回唯一的子节点信息。
查找所有pet的name。分别使用XDocument和XElement查找。
XDocument document = XDocument.Load("MyPets.xml");
XElement element = XElement.Load("MyPets.xml");
var name = from pet in document.Elements("pets").Elements("pet")
select pet.Element("name").Value;
var pets = from pet in element.Elements("pet")
select pet;
Array.ForEach(pets.ToArray(), p=>Console.WriteLine(p.Element("name").Value));
Array.ForEach(name.ToArray(), n => Console.WriteLine(n));
四、修改XML文档
修改pet的id
XElement element = XElement.Load("MyPets.xml");
var query = from pet in element.Elements("pet")
select pet.Element("id");
foreach (var id in query)
{
id.Value = Guid.NewGuid().ToString();
}
element.Save("NewPets.xml");
添加节点到owner到pet
XElement element = XElement.Load("MyPets.xml");
var query = from pet in element.Elements("pet")
select pet;
foreach (var p in query)
{
XElement owner = new XElement("owner", "mshijie");
p.Add(owner);
}
element.Save("NewPets.xml");
删除节点
var query = from pet in element.Elements("pet")
select pet;
foreach (var p in query)
{
p.Element("owner").Remove();
}
element.Save("NewPets.xml");
五、访问节点属性
XElement element = XElement.Load("MyPets.xml");
var query = from pet in element.Elements("pet")
select pet;
foreach (var p in query)
{
XAttribute attr = new XAttribute("size", "small");
p.Add(attr);//添加属性
p.Attribute("size").Remove();//删除属性
}
element.Save("NewPets.xml");
六、创建xml文档
XElement contacts =
new XElement("Contacts",
new XElement("Contact",
new XElement("Name", "Patrick Hines"),
new XElement("Phone", "206-555-0144",
new XAttribute("Type", "Home")),
new XElement("phone", "425-555-0145",
new XAttribute("Type", "Work")),
new XElement("Address",
new XElement("Street1", "123 Main St"),
new XElement("City", "Mercer Island"),
new XElement("State", "WA"),
new XElement("Postal", "68042")
)
)
);
XElement构造函数接受两个参数,节点名和Content,Content可以是简单字符串,也可以的属性和子节点集合。
七、处理命名空间
创建带命名空间的xml文档
XNamespace myns = "http://www.cnblogs.com/mshijie";
XElement root = new XElement(myns + "pets",
new XAttribute(XNamespace.Xmlns + "myns", myns),
new XElement(myns + "pet",
new XElement(myns + "name", "Dog")));
root.Save("test.xml");
test.xml
<?xml version="1.0" encoding="utf-8"?>
<myns:pets xmlns:myns="http://www.cnblogs.com/mshijie">
<myns:pet>
<myns:name>Dog</myns:name>
</myns:pet>
</myns:pets>
查询
XNamespace myns = "http://www.cnblogs.com/mshijie";
XElement pets = XElement.Load("test.xml");
var query = from pet in pets.Elements(myns + "pet")
select pet;
Array.ForEach(query.ToArray(), p => Console.WriteLine(p.Element(myns + "name").Value));
本文介绍LINQ to XML的基础操作,包括加载、查询、修改XML文档等,并演示如何创建XML文档及处理命名空间。
1437

被折叠的 条评论
为什么被折叠?



