XML类
Linq to XML可以以两种方式和XML配合。第一种方式是作为简化的XML操作API,和二种方式是使用本章前面看到的Linq查询工具
Linq to XML API由很多表示XML树组件的类组成,其中有三个类比较重要:XElement/XAttribute/XDocument
从示例出发:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace CodeForLinq
{
class Program
{
static void Main(string[] args)
{
//XDocument表示一个XML文档
//XElement表示一个XML元素
XDocument employees1 =
new XDocument(
//创建一个Employees根节点
new XElement("Employees",
//创建两个子节点
new XElement("Name", "Bob Smith"),
new XElement("Name", "Sally Jones")
)
);
//通过Save方法将XML文档保存
employees1.Save("Employees.xml");
//通过Load方法加载XML文档
XDocument employees2 = XDocument.Load("Employees.xml");
//打印出XML文档结构
Console.WriteLine(employees2.ToString());
Console.ReadKey();
}
}
}
输出:
<Employees>
<Name>Bob Smith</Name>
<Name>Sally Jones</Name>
</Employees>
XML树的嵌套关系
- XDocument (文档)
- XDeclaration ?
- XDocumentType ?
- XProcessingInstruction *
- XElement ? (根节点)
- XElement * (节点)
- XComment *
- XAttribute *
- XProcessingInstruction *
?表示0个或1个;*表示这个或多个
语法解析:
public XDocument(params object[] content);
参数表示文档所包含的内容,即要添加到此文档的内容对象的参数列表,上例添加了一个根节点
public XElement(XName name, params object[] content);
第一个参数是对象名
第二个参数以及之后的参数包含了XML树的节点;第二个参数是一个Params参数,也就是说可以有任意多个参数
然后在根点中又添加了两个节点
使用XML树的值
用于获取XML树的值的方法有:
-
Nodes
-所在类为XDocumet/XElement
,返回类型是IEnumerable<object>
,它会返回当前节点的所有子节点,不管什么什么类型,可以使用OfType来指定返回某个类型的节点,如IEnmerable<XCmment> comments = xd.Nodes().OfType<XComment>();
,返回XComment
类型的节点 -
Elements
-所在类为XDocumet/XElement
,返回类型是IEnumerable<XElement>
,它返回当前节点的XElement子节点,或所有具有某个 名字的子节点 -
Element
-所在类为XDocumet/XElement
,返回类型是Element
,它返回当前一个的Element子节点,或所有具有某个 名字的子节点 -
Descendants
-所在类为XElement
,返回类型是IEnumerable<XElement>
,它返回所有的XElement
子代节点,或所有具有某个名字的XElement
子代节点,不管它们处于当前节点下嵌套的什么层次 -
DescendantsAndSelf
-所在类为XElement
,返回类型是IEnumerable<XElement>
,和Descendants
一样,但是包括当前节点 -
Ancestors
-所在类为XElement
,返回类型是IEnumerable<XElement>
,返回所有上级XElement
节点,或者所有具有某个名字的上级XElement
节点 -
AncestorsAndSelf
-所在类为XElement
,返回类型是IEnumerable<XElement>
,和AncestorsAndSelf
一样,但是包括当前节点 -
Parent
-所在类为XElement
,返回类型是XElement
,返回当前节点的父节点
示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace CodeForLinq
{
class Program
{
static void Main(string[] args)
{
//XDocument表示一个XML文档
//XElement表示一个XML元素
XDocument employees1 =
new XDocument(
//创建一个Employees根节点
new XElement("Employees",
//创建两个子节点
new XElement("Employee",
new XElement("Name", "Bob Smith"),
new XElement("PhoneNumber", "13161861814")),
new XElement("Employee",
new XElement("Name", "Sally Jones"),
new XElement("PhoneNumber", "13161861815"),
new XElement("PhoneNumber", "13161861816"))
));
//获取第一个名为"Employees"的子XElement
XElement root = employees1.Element("Employees");//其实就是根节点
IEnumerable<XElement> employess = root.Elements();//根节点下所有的子节点
foreach (XElement emp in employess)
{
//获取第一个名为"Name"的子XElement
XElement empNameNode = emp.Element("Name");
Console.WriteLine(empNameNode.Value);
//获取第一个名为"PhoneNumber"的子XElement
IEnumerable<XElement> empPhones = emp.Elements("PhoneNumber");
foreach (XElement phone in empPhones)
Console.WriteLine(phone.Value);
}
Console.ReadKey();
}
}
}
增加节点以及操作XML
可以使用Add
方法为现在元素增加子元素
Add
方法允许一次增加任意多个元素,不管增加的节点类型是什么类型
示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace CodeForLinq
{
class Program
{
static void Main(string[] args)
{
//创建xml文档,并添加一个根节点一个子节点
XDocument xd = new XDocument(
new XElement("root",
new XElement("first")
)
);
Console.WriteLine("Origianl tree");
Console.WriteLine(xd);//展示一下目前的树结构
Console.WriteLine();
//获取第一个元素
XElement rt = xd.Element("root");
//添加子元素
rt.Add(new XElement("second"));
//连续添加三个元素
rt.Add(
new XElement("thrid"),
new XElement("fourth"),
new XElement("fifth")
);
//Add方法会把新添加的子节点放到已有的子节点之后
Console.WriteLine("Modified tree");
Console.WriteLine(xd);
Console.ReadKey();
}
}
}
其他常用方法
- AddFirst - 在当前既有的子节点之前添加新的子节点
- AddBeforeSelf - 在同级别的当前节点之前增加新的子节点
- AddAfterSelf - 在同级别的当前节点之后增加新的子节点
- Remove - 删除当前所选的节点及内容
- RemoveNodes - 删除当前所先的的XElements及其内容
- SetElement - 设置节点的内容
- ReplaceContent - 替换节点的内容
使用XML特性(属性)
示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace CodeForLinq
{
class Program
{
static void Main(string[] args)
{
XDocument xd = new XDocument(
new XElement("root",
new XAttribute("color","red"),
new XAttribute("size","large"),
new XElement("first"),
new XElement("second")
)
);
Console.WriteLine(xd);
Console.ReadKey();
}
}
}
输出:
<root color="red" size="large">
<first />
<second />
</root>
XAttribute
在XElement
的构造中设置其属性值,第一个参数指定属性名,第二个参数指定属性值
再来看看获取特性值的示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace CodeForLinq
{
class Program
{
static void Main(string[] args)
{
XDocument xd = new XDocument(
new XElement("root",
new XAttribute("color","red"),
new XAttribute("size","large"),
new XElement("first"),
new XElement("second")
)
);
Console.WriteLine(xd);
Console.WriteLine("---------");
XElement rt = xd.Element("root");
XAttribute color = rt.Attribute("color");
XAttribute size = rt.Attribute("size");
Console.WriteLine("颜色值:{0}",color.Value);
Console.WriteLine("大小值:{0}", size.Value);
Console.ReadKey();
}
}
}
输出:
<root color="red" size="large">
<first />
<second />
</root>
---------
颜色值:red
大小值:large
移除特性
示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace CodeForLinq
{
class Program
{
static void Main(string[] args)
{
XDocument xd = new XDocument(
new XElement("root",
new XAttribute("color","red"),
new XAttribute("size","large"),
new XElement("first"),
new XElement("second")
)
);
Console.WriteLine(xd);
Console.WriteLine("---------");
XElement rt = xd.Element("root");
//第一种移除方法
rt.Attribute("color").Remove();
//第二种移除方法
rt.SetAttributeValue("size", null);
Console.WriteLine(xd);
Console.ReadKey();
}
}
}
输出
<root color="red" size="large">
<first />
<second />
</root>
---------
<root>
<first />
<second />
</root>
增加与修改特性值
示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace CodeForLinq
{
class Program
{
static void Main(string[] args)
{
XDocument xd = new XDocument(
new XElement("root",
new XAttribute("color","red"),
new XAttribute("size","large"),
new XElement("first"),
new XElement("second")
)
);
Console.WriteLine(xd);
Console.WriteLine("---------");
XElement rt = xd.Element("root");
//修改特性值
rt.SetAttributeValue("color","green");
//添加一个新的特性
rt.SetAttributeValue("width", "narrow");
Console.WriteLine(xd);
Console.ReadKey();
}
}
}
输出:
<root color="red" size="large">
<first />
<second />
</root>
---------
<root color="green" size="large" width="narrow">
<first />
<second />
</root>
关于节点的其他类型
- XComment - XML文档的注释;语法
new XComment("这是一行注释")
- XDeclaration - XML的版本号、字符编码类型等元数据,这叫XML声明 ;语法
new XDeclaration("1.0","utf08","yes")
,对应结果为<?xml version="1.0" encoding="uft-8" standlaone="yes"?>
- XProcessingInstruction- XML的处理指令;语法
new XProcessingInstruction ("xml-stylesheet",@"href=""stories"" type=""text/css""")
,对应结果为:<?xml-stylesheet href="stories.css" type="text/css">
完整示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace CodeForLinq
{
class Program
{
static void Main(string[] args)
{
XDocument xd = new XDocument(
new XDeclaration("1.0","utf08","yes"),
new XComment("这是一行注释"),
new XProcessingInstruction ("xml-stylesheet",@"href=""stories"" type=""text/css"""),
new XElement("root",
new XAttribute("color","red"),
new XAttribute("size","large"),
new XElement("first"),
new XElement("second")
)
);
Console.WriteLine(xd);
Console.ReadKey();
}
}
}
输出:
<!--这是一行注释-->
<?xml-stylesheet href="stories" type="text/css"?>
<root color="red" size="large">
<first />
<second />
</root>
使用Linq to XML的Linq查询
示例一:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace CodeForLinq
{
class Program
{
static void Main(string[] args)
{
XDocument xd = new XDocument(
new XDeclaration("1.0", "utf08", "yes"),
new XComment("这是一行注释"),
new XProcessingInstruction("xml-stylesheet", @"href=""stories"" type=""text/css"""),
new XElement("root",
new XAttribute("color", "red"),
new XAttribute("size", "large"),
new XElement("first",
new XAttribute("color", "red"),
new XAttribute("size", "large")
),
new XElement("second",
new XAttribute("color", "green"),
new XAttribute("size", "large")
),
new XElement("thrid",
new XAttribute("color", "yello"),
new XAttribute("size", "large")
)
)
);
xd.Save("Hello.xml");
Console.WriteLine(xd);
XDocument doc = XDocument.Load("Hello.xml");
XElement root = doc.Element("root");
var xyz = from e in root.Elements()
where e.Name.ToString().Length == 5 // 获取五个字符的元素
select e;
foreach (var item in xyz)
{
Console.WriteLine(item.Name.ToString());
}
Console.WriteLine("-------");
foreach (var item in xyz)
{
Console.WriteLine("Name:{0}, Color:{1}, Size:{2}",item.Name,item.Attribute("color").Value,item.Attribute("size").Value);
}
Console.ReadKey();
}
}
}
输出:
<!--这是一行注释-->
<?xml-stylesheet href="stories" type="text/css"?>
<root color="red" size="large">
<first color="red" size="large" />
<second color="green" size="large" />
<thrid color="yello" size="large" />
</root>
first
thrid
-------
Name:first, Color:red, Size:large
Name:thrid, Color:yello, Size:large
示例二:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace CodeForLinq
{
class Program
{
static void Main(string[] args)
{
XDocument xd = new XDocument(
new XDeclaration("1.0", "utf08", "yes"),
new XComment("这是一行注释"),
new XProcessingInstruction("xml-stylesheet", @"href=""stories"" type=""text/css"""),
new XElement("root",
new XAttribute("color", "red"),
new XAttribute("size", "large"),
new XElement("first",
new XAttribute("color", "red"),
new XAttribute("size", "large")
),
new XElement("second",
new XAttribute("color", "green"),
new XAttribute("size", "large")
),
new XElement("thrid",
new XAttribute("color", "yello"),
new XAttribute("size", "large")
)
)
);
xd.Save("Hello.xml");
Console.WriteLine(xd);
Console.WriteLine("\n-------");
XDocument doc = XDocument.Load("Hello.xml");
XElement root = doc.Element("root");
var xyz = from e in root.Elements()
select new {e.Name, color=e.Attribute("color").Value };
foreach (var item in xyz)
{
Console.WriteLine(item);
}
Console.WriteLine("\n-------");
foreach (var item in xyz)
{
Console.WriteLine("{0,-6}, color:{1,-7}",item.Name,item.color);
}
Console.ReadKey();
}
}
}
输出:
<!--这是一行注释-->
<?xml-stylesheet href="stories" type="text/css"?>
<root color="red" size="large">
<first color="red" size="large" />
<second color="green" size="large" />
<thrid color="yello" size="large" />
</root>
-------
{ Name = first, color = red }
{ Name = second, color = green }
{ Name = thrid, color = yello }
-------
first , color:red
second, color:green
thrid , color:yello
网友评论