概述
LINQ to XML 是一种启用了 LINQ 的内存 XML 编程接口,使用它,可以在.NET Framework 编程语言中处理 XML。
它将 XML 文档置于内存中,这一点很像文档对象模型 (DOM)。 您可以查询和修改 XML 文档,修改之后,可以将其另存为文件,也可以将其序列化然后通过网络发送。 但是,LINQ to XML 与 DOM 不同: 它提供一种新的对象模型,这是一种更轻量的模型,使用也更方便。
LINQ to XML 最重要的优势是它与 Language-Integrated Query (LINQ) 的集成。 由于实现了这一集成,因此,可以对内存 XML 文档编写查询,以检索元素和属性的集合。 LINQ to XML 的查询功能在功能上(尽管不是在语法上)与 XPath 和XQuery 具有可比性。
通过将查询结果用作 XElement 和 XAttribute 对象构造函数的参数,实现了一种功能强大的创建 XML 树的方法。 这种方法称为“函数构造”,利用这种方法,开发人员可以方便地将 XML 树从一种形状转换为另一种形状。
另外在使用代码LINQ to XML时要用到using System.Xml.Linq;空间,它为我们提供了要处理XML文档的接口与方法。
创建XML元素
LINQ to XML使用XElement类创建元素。如下例子:
using System;
using System.Xml.Linq;
using System.IO;
namespace xmltest
{
class Program
{
static void Main(string[] args)
{
XElement xml =
new XElement("Persons",
new XElement("Person",
new XElement("Name", "John"),
new XElement("Age", "28")
),
new XElement("Person",
new XElement("Name", "Tom"),
new XElement("Age", "27")
)
);
string xmlstr=xml.ToString();
// xml.Save(@"Data.xml"); //保存到文件
Console.WriteLine(xmlstr);
}
}
}
运行结果为:
<Persons>
<Person>
<Name>John</Name>
<Age>28</Age>
</Person>
<Person>
<Name>Tom</Name>
<Age>27</Age>
</Person>
</Persons>
创建XML文档
LINQ to XML使用XDocument类创建文档。如下例子:
static void Main()
{
var xDoc = new XDocument(new XElement( "root",
new XElement("dog", //创建元素节点
new XText("dog said black is a beautify color"), //创建节点值
new XAttribute("color", "black")), //创建属性节点
new XElement("cat"),
new XElement("pig", "pig is great")));
//xDoc输出xml的encoding是系统默认编码
//默认是缩进格式化的xml,而无须格式化设置
string xmlstr = xDoc.ToString();
//xDoc.Save(@"data.xml"); //xml文件中会比显示的多一行
Console.WriteLine(xmlstr);
}
运行结果为:
<root>
<dog color="black">dog said black is a beautify color</dog>
<cat/>
<pig>pig is great</pig>
</root>
查询XML结点
Linq是从集合中查询对象,在linq to xml中的集合是通过XElement类的Elements(),Elements(string name),以及Descendants、DescendantsAndSelf、Ancestors、AncestorsAndSelf的几个重载方法中获得。获得XElement集合之后,可以通过XElement的Attribute(string name)方法获得元素的属性值,可以通过XElement的Value属性获得节点的文本值;
static void Main(string[] args)
{
string xmlString = @"<persons>
<person>
<name>John</name>
<age>28</age>
</person>
</persons>";
XElement xe = XElement.Parse(xmlString,LoadOptions.SetLineInfo);
//读取元素 读取Name的后面的第一个兄弟元素
XElement xe1 = xe.Element("person").Element("name").ElementsAfterSelf().First();
Console.WriteLine(xe1.Value); //输出 28
//读取父节点
XElement xe2 = xe1.Parent;
Console.WriteLine(xe2.Name);
}
修改XML
修改XML也非常简单,可以通过XElement的Add,Remove,RemoveAll等方法对xml文档进行修改。如下代码:
static void Main(string[] args)
{
string xmlString = @"<Persons>
<Person>
<Name>John</Name>
<Age>28</Age>
</Person>
</Persons>";
XElement xe = XElement.Parse(xmlString, LoadOptions.SetLineInfo);
//这是添加在最后,如果想添加在最前面可以使用AddFirst,
//添加在本节点之前AddBeforSelf,添加在本节点之后AddAfterSelf
xe.Add(new XElement("Person",
new XElement("Name", "Tom"),
new XElement("Age", 26)
)
);
//删除所有子节点
xe.RemoveAll();
TextWriter tw = new StringWriter();
//第二个参数SaveOptions枚举支持设置格式,缩进,保留无关重要的空白,去除重复命名空间
xe.Save(tw, SaveOptions.None);
Console.WriteLine(tw);
}
遍历XML
我们用linq to xml 遍历xml文档可以用以下三种方法,如下代码:
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("Used XNode:");
foreach (XNode n in xel.Nodes())
{
Console.WriteLine(n);
}
Console.WriteLine("----------------------------");
Console.WriteLine("Used XElement:");
foreach (XElement e in xel.Elements("Persons"))
{
Console.WriteLine(e);
}
Console.WriteLine("----------------------------");
Console.WriteLine("Used Lambda:");
var query = xel.Elements().Select(u => u);
foreach (var q in query)
{
Console.WriteLine(q);
}
}
转载于:https://blog.51cto.com/xingcheng/1757237