原文 C#操作XML
C#操作XML
1. .NET对读写XML文件的支持....................... 1
(1) System.Xml命名空间............................ 1
(2) System.Xml.XPath命名空间................ 2
(3) System.Xml.Xsl命名空间.................... 2
(4) System.Xml.Linq命名空间.................. 2
2. 使用XmlReader、XmlWriter简单的读写XML(只进读写) 2
(1) System.Xml命名空间............................ 2
(2) 使用XmlReader类读XML文件.............. 3
(3) 使用XmlReader类进行验证XML文件.. 3
(4) 使用XmlWriter类写XML文件.............. 4
3. 使用XmlDocument、XmlNode实现DOM读写XML 5
(1) 测试的XML文件(XML.xml)................... 5
(2) 测试查找与插入节点的代码.................. 5
4. 使用XPathNavigator类快速查询XML文档元素 6
(1) System.Xml.XPath命名空间................ 6
(2) XPathNavigator类介绍........................ 6
(3) 使用XPathNavigator对象查询XML元素 6
(4) 使用XPathNavigator对象查询并修改XML元素 7
5. XSL转换数据格式........................................ 7
(1) System.Xml.Xsl命名空间.................... 7
(2) 使用XslCompiledTransform类转换数据格式 7
(3) 使用XsltArgumentList类绑定对象到命名空间 8
(4) 调试XSLT................................................ 9
6. 在XML中序列化对象.................................... 9
(1) .NET对象序列化的方式介绍................. 9
(2) 使用XmlSerializer序列化与反序列化 9
7. 使用LINQ查询XML文档............................ 10
(1) System.Xml.Linq命名空间................ 10
(2) System.Xml.Linq命名空间类的基本使用 10
(3) 查询静态的XML文档............................ 11
(4) 查询动态的XML.................................... 11
1..NET对读写XML文件的支持
(1)System.Xml命名空间
System.Xml命名空间为处理XML提供基于标准的支持,其中提供了许多管理XML文档和XML流方式的类,还提供了一些类(例如XmlDataDocument)则是提供了XML数据存储器和存储在DataSet中的关系数据之间的桥梁。
以下是System.Xml命名空间读写XML较重要的类:
XmlReader
|
表示提供XM数据进行快速、非缓存、只进访问的读取器。
|
XmlWriter
|
提供一种快速、非缓存和只进的方式来生成包含XML数据的流或文件。
|
XmlTextReader
|
表示提供对XML数据进行快速、非缓存、只进访问的读取器。
|
XmlTextWriter
|
表示提供快速、非缓存、只进方法的编写器,生成包含XML数据的流或文件。
|
XmlResolver
|
解析由统一资源标识符 URI)命名的外部 XML 资源。
|
XmlUrlResolver
|
解析由统一资源标识符(URI 命名的外部 XML 资源。
|
XmlDataDocument
|
允许通过相关的DataSet存储、检索和操作结构化数据。
|
以下是System.Xml命名空间对读写XML文件支持的基础类:
XmlDocument
|
表示 XML 文档。
|
XmlComment
|
表示 XML 注释的内容。
|
XmlDocumentType
|
表示文档类型声明。
|
XmlDeclaration
|
表示 XML 声明节点:<?xml version='1.0'...?>。
|
XmlNode
|
表示 XML 文档中的单个节点。
|
XmlNodeList
|
表示排序的节点集合。
|
XmlElement
|
表示一个元素。
|
XmlAttribute
|
表示一个属性。
|
XmlText
|
表示元素或属性的文本内容。
|
XmlEntity
|
表示实体声明,例如 <!ENTITY... >.
|
XmlEntityReference
|
表示实体引用节点
|
(2)System.Xml.XPath命名空间
System.Xml.XPath命名空间中包含的类用于定义光标模型,该模型可将 XML 信息项作为 XQuery 1.0 和 XPath 2.0 数据模型的实例进行导航和编辑。
System.Xml.XPath命名空间重要的类:
XPathDocument
|
提供整个XML文档的视图,只读
|
XPathNavigator
|
为定位和编辑 XML 数据提供游标模型。
|
XPathNodeIterator
|
在一组选中的节点上提供迭代器。
|
XPathItem
|
表示 XQuery 1.0 和 XPath 2.0 数据模型中的项。
|
XPathExpression
|
提供表示已编译的 XPath 表达式的类型化类。
|
XPathException
|
提供在处理 XPath 表达式的过程中发生错误时所引发的异常。
|
(3)System.Xml.Xsl命名空间
System.Xml.Xsl命名空间为“可扩展样式表转换”(XSLT) 转换提供支持。它支持“W3C XSL 转换 (XSLT) 1.0 版推荐”(www.w3.org/TR/xslt)。
System.Xml.Xsl命名空间重要的类:
XslCompiledTransform
|
使用 XSLT 样式表转换 XML 数据。
|
XsltArgumentList
|
包含数目可变的参数(这些参数是 XSLT 参数,或者是扩展对象)。
|
XsltContext
|
可扩展样式表转换语言 (XSLT) 处理器的当前执行上下文。
|
XsltSettings
|
指定执行 XSLT 样式表时要支持的 XSLT 功能。
|
(4)System.Xml.Linq命名空间
包含LINQ to XML的类。LINQ to XML是内存中的XML编程接口,使您可以轻松有效地修改XML文档。使用LINQ to XML可以进行以下操作:从文件或流加载XML;将XML序列化为文件或流;使用功能构造从头创建XML树;使用LINQ查询来查询XML树;操作内存中的XML树;使用XSD验证XML树。组合使用这些功能将XML树从一种形状转换为另一种形状。
System.Xml.Linq命名空间较重要的类:
XDocument
|
表示 XML 文档。
|
XComment
|
表示一个 XML 注释。
|
XNamespace
|
表示一个 XML 命名空间。无法继承此类。
|
XNode
|
表示 XML 树中节点的抽象概念(元素、注释、文档类型、处理指令或文本节点)。
|
XElement
|
表示一个 XML 元素。
|
XAttribute
|
表示一个 XML 属性。
|
XName
|
表示 XML 元素或属性的名称。
|
XText
|
表示一个文本节点。
|
2.使用XmlReader、XmlWriter简单的读写XML(只进读写)
(1)System.Xml命名空间
System.Xml命名空间为处理XML提供基于标准的支持,其中提供了许多管理XML文档和XML流方式的类,还提供了一些类(例如XmlDataDocument)则是提供了XML数据存储器和存储在DataSet中的关系数据之间的桥梁。
以下是System.Xml命名空间读写XML较重要的类:
XmlReader
|
表示提供XM数据进行快速、非缓存、只进访问的读取器。
|
XmlWriter
|
提供一种快速、非缓存和只进的方式来生成包含XML数据的流或文件。
|
XmlTextReader
|
表示提供对XML数据进行快速、非缓存、只进访问的读取器。
|
XmlTextWriter
|
表示提供快速、非缓存、只进方法的编写器,生成包含XML数据的流或文件。
|
XmlResolver
|
解析由统一资源标识符 URI)命名的外部 XML 资源。
|
XmlUrlResolver
|
解析由统一资源标识符(URI 命名的外部 XML 资源。
|
XmlDataDocument
|
允许通过相关的DataSet存储、检索和操作结构化数据。
|
以下是System.Xml命名空间对读写XML文件支持的基础类:
XmlDocument
|
表示 XML 文档。
|
XmlComment
|
表示 XML 注释的内容。
|
XmlDocumentType
|
表示文档类型声明。
|
XmlDeclaration
|
表示 XML 声明节点:<?xml version='1.0'...?>。
|
XmlNode
|
表示 XML 文档中的单个节点。
|
XmlNodeList
|
表示排序的节点集合。
|
XmlElement
|
表示一个元素。
|
XmlAttribute
|
表示一个属性。
|
XmlText
|
表示元素或属性的文本内容。
|
XmlEntity
|
表示实体声明,例如 <!ENTITY... >.
|
XmlEntityReference
|
表示实体引用节点
|
(2)使用XmlReader类读XML文件
要读取的XML文件(XML.xml)内容:
<?xml version="1.0" encoding="utf-8"?>
<根节点>
<字符串>测试字符串!!!ABCD</字符串>
<数字 属性1="李志伟" 属性2="lizhiwei">123.456</数字>
</根节点>
读取的XML文件内容的代码:
class Program
{
static void Main(string[] args)
{
XmlReader rxml = XmlReader.Create(@"..\..\XML\XML.xml");
while (rxml.Read())//读取节点
{ //操作当前节点
Console.WriteLine("节点名:" + rxml.Name + "\t节点类型:" + rxml.NodeType);
for (int i = 0; i < rxml.AttributeCount; i++)
{
Console.WriteLine("属性:"+rxml.GetAttribute(i));//读取属性
}
if (rxml.Name == "数字")
{ //读取数字
Console.WriteLine("数字值:" + rxml.ReadElementContentAsDouble()*100);
}
else if (rxml.Name == "字符串")
{//读取字符串
Console.WriteLine("字符串值:" + rxml.ReadElementContentAsString());
}
Console.WriteLine("====================================================");
}
rxml.Close();
Console.Read();
}
}
(3)使用XmlReader类进行验证XML文件
XML.xml文件不变,增加XMLSchema.xsd文件如下:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="根节点">
<xs:complexType>
<xs:sequence>
<xs:element name="字符串" type="xs:string"/>
<xs:element name="数字">
<xs:complexType>
<xs:attribute name="属性1" type="xs:string"/>
<!-- 未定义属性2-->
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
程序代码:
class Program
{
static void Main(string[] args)
{
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add(null, @"..\..\XML\XMLSchema.xsd");
settings.ValidationType = ValidationType.Schema;
settings.ValidationEventHandler += new ValidationEventHandler(Error);
XmlReader rxml = XmlReader.Create(@"..\..\XML\XML.xml", settings);
while (rxml.Read())//读取节点
{//操作当前节点
Console.WriteLine("节点名:" + rxml.Name + "\t节点类型:" + rxml.NodeType);
for (int i = 0; i < rxml.AttributeCount; i++)
{
Console.WriteLine("属性:"+rxml.GetAttribute(i));//读取属性
}
if (rxml.Name == "数字")
{//读取数字
Console.WriteLine("数字值:" + rxml.ReadElementContentAsDouble()*100);
}
else if (rxml.Name == "字符串")
{//读取字符串
Console.WriteLine("字符串值:" + rxml.ReadElementContentAsString());
}
Console.WriteLine("====================================================");
}
rxml.Close();
Console.Read();
}
//读取XML错误时调用的方法
static void Error(object sender, ValidationEventArgs e)
{
Console.WriteLine("########XML格式出错:"+e.Message);
}
}
(4)使用XmlWriter类写XML文件
XmlWriter类可以吧XML数据写入一个流、文件、StringBuilder、TextWriter或另一个XmlWriter对象。与XmlReader一样XmlWriter类以只向前、未缓存的方式进行写入。XmlWriter类的可配置性很高,可以指定是否缩进内容、缩进量、在属性中使用什么引号,以及是否支持名称空间等信息。与XmlReader类一样,这个配置使用XmlWriterSettings对象。
class Program
{
static void Main(string[] args)
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;//设置使用缩进
settings.NewLineOnAttributes = true;//设置将属性写入新行
XmlWriter wxml = XmlWriter.Create(@"..\..\XML\newXML.xml",settings);
wxml.WriteStartDocument();//写入XML的申明
wxml.WriteStartElement("根节点");//开始写根节点==
wxml.WriteStartElement("节点");//开始写节点
wxml.WriteAttributeString("姓名", "李志伟");//写属性
wxml.WriteAttributeString("年龄", "20");//写属性
wxml.WriteString("李志伟lizhiwei");//写节点内容
wxml.WriteEndElement();//节点写完
wxml.WriteElementString("标题","测试节点!!!ABCD");//直接写无属性节点
wxml.WriteEndElement();//根节点写完==
wxml.Close();
Console.WriteLine("OK!");
Console.Read();
}
}
3.使用XmlDocument、XmlNode实现DOM读写XML
(1)测试的XML文件(XML.xml)
<?xml version="1.0" encoding="utf-8"?>
<根节点>
<节点>元素类容</节点>
<数字 属性1="李志伟" 属性2="lizhiwei">123.456</数字>
<数字>123456.789</数字>
<子节点>
<整数>123456</整数>
<字符串>李志伟</字符串>
<空节点 作用="测试插入节点">
</空节点>
</子节点>
</根节点>
(2)测试查找与插入节点的代码
class Program
{
static void Main(string[] args)
{
XmlDocument xml = new XmlDocument();
xml.Load(@"..\..\XML\XML.xml");//加载XML文件
//得到一组节点
XmlNodeList nodes = xml.GetElementsByTagName("数字");
foreach (XmlNode node in nodes)
{
Console.WriteLine("节点=======" + node.Name + "\t" + node.InnerText);
foreach (XmlAttribute a in node.Attributes)
{
Console.WriteLine("属性:" + a.Name + "\t" + a.Value);
}
}
//创建要插入的节点
XmlElement element = xml.CreateElement("插入节点");//创建节点
element.SetAttribute("姓名", "李志伟");//设置属性
element.SetAttribute("年龄", "20");//设置属性
XmlElement child = xml.CreateElement("插入子节点");//创建节点
child.InnerText = "测试插入节点!ABCD";//设置节点内容
element.AppendChild(child);
//设置插入节点的位置
nodes = xml.GetElementsByTagName("空节点");
nodes[0].AppendChild(element);//插入节点
xml.Save(@"..\..\XML\XML.xml");
Console.WriteLine("OK!");
Console.Read();
}
}
注意:在使用XmlDocument的GetElementById方法时,需要使用DTD定义哪些属性是ID类型的属性,否者调用GetElementById时返回null。
4.使用XPathNavigator类快速查询XML文档元素
(1)System.Xml.XPath命名空间
System.Xml.XPath命名空间中包含的类用于定义光标模型,该模型可将 XML 信息项作为 XQuery 1.0 和 XPath 2.0 数据模型的实例进行导航和编辑。
System.Xml.XPath命名空间重要的类:
XPathDocument
|
提供整个XML文档的视图,只读
|
XPathNavigator
|
为定位和编辑 XML 数据提供游标模型。
|
XPathNodeIterator
|
在一组选中的节点上提供迭代器。
|
XPathItem
|
表示 XQuery 1.0 和 XPath 2.0 数据模型中的项。
|
XPathExpression
|
提供表示已编译的 XPath 表达式的类型化类。
|
XPathException
|
提供在处理 XPath 表达式的过程中发生错误时所引发的异常。
|
(2)XPathNavigator类介绍
XPathNavigator类在System.Xml.XPath命名空间中,XPathNavigator类包含移动和选择所需元素的所有方法,分别是MoveXXX()与SelectXXX()方法。使用XPathNavigator类多数情况下是需要查找XML文档元素,而不是修改XML文档。
使用XPathNavigator类需与System.Xml.XPath命名空间里的其它类一起使用,详细请查看System.Xml.XPath命名空间。
(3)使用XPathNavigator对象查询XML元素
测试的XML文件
<?xml version="1.0" encoding="utf-8"?>
<根节点>
<节点 节点名="A">
<子节点1>AAA子节点1</子节点1>
<子节点2>AAA子节点2</子节点2>
<子节点3>AAA子节点3</子节点3>
</节点>
<节点 节点名="B">
<子节点1>BBB子节点1</子节点1>
<子节点2>BBB子节点2</子节点2>
<子节点3>BBB子节点3</子节点3>
</节点>
<节点 节点名="A">
<子节点1>CCC子节点1</子节点1>
<子节点2>CCC子节点2</子节点2>
<子节点3>CCC子节点3</子节点3>
</节点>
</根节点>
测试的代码
class Program
{
static void Main(string[] args)
{
XPathDocument xml = new XPathDocument(@"..\..\XML\XML.xml");
XPathNavigator nav = xml.CreateNavigator();
XPathNodeIterator iter = nav.Select("根节点/节点[@节点名='A']");//查询
while (iter.MoveNext())//下一个结果
{
Console.WriteLine(iter.Current.Name + "\t" + iter.Current.Value);
XPathNodeIterator temp =
iter.Current.SelectDescendants(XPathNodeType.Element,false);//查询
while (temp.MoveNext())//下一个结果
{
Console.WriteLine(temp.Current.Name + "\t" + temp.Current.Value);
}
}
Console.WriteLine("OK!");
Console.Read();
}
}
注意:有关XPath表达式的语法请查询Visual Studio文档!
(4)使用XPathNavigator对象查询并修改XML元素
使用XmlDocument对象创建的XPathNavigator对象,可以修改XML文档。上例的XML文档不变,代码如下:
class Program
{
static void Main(string[] args)
{
XmlDocument xml = new XmlDocument();
xml.Load(@"..\..\XML\XML.xml");
XPathNavigator nav = xml.CreateNavigator();
XPathNodeIterator iter = nav.Select("根节点/节点[@节点名='A']");//查询
while (iter.MoveNext())
{
Console.WriteLine(iter.Current.Name + "\t" + iter.Current.Value);
XPathNodeIterator temp =
iter.Current.SelectDescendants(XPathNodeType.Element,false);//查询
while (temp.MoveNext())
{
Console.WriteLine(temp.Current.Name + "\t" + temp.Current.Value);
temp.Current.InsertBefore("<插入子节点>李志伟</插入子节点>");//插入节点
}
}
xml.Save(@"..\..\XML\XML.xml");
Console.WriteLine("OK!");
Console.Read();
}
}
5.XSL转换数据格式
(1)System.Xml.Xsl命名空间
System.Xml.Xsl命名空间为“可扩展样式表转换”(XSLT) 转换提供支持。它支持“W3C XSL 转换 (XSLT) 1.0 版推荐”(www.w3.org/TR/xslt)。
System.Xml.Xsl命名空间重要的类:
XslCompiledTransform
|
使用 XSLT 样式表转换 XML 数据。
|
XsltArgumentList
|
包含数目可变的参数(这些参数是 XSLT 参数,或者是扩展对象)。
|
XsltContext
|
可扩展样式表转换语言 (XSLT) 处理器的当前执行上下文。
|
XsltSettings
|
指定执行 XSLT 样式表时要支持的 XSLT 功能。
|
(2)使用XslCompiledTransform类转换数据格式
可以使用XslCompiledTransform类把XML文件数据转换成其他格式的文件,本例使用XSLT文件(XSLTFile.xslt)把XML文件(XML.xml)转换成一个HTML文档。
XSLTFile.xslt文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:template match="/">
<html>
<head><title>李志伟</title></head>
<body><table border="1"><xsl:apply-templates/></table></body>
</html>
</xsl:template>
<xsl:template match="根节点">
<xsl:apply-templates select="节点"/>
</xsl:template>
<xsl:template match="节点">
<tr>
<td><xsl:apply-templates select="子节点1"/></td>
<td><xsl:apply-templates select="子节点2"/></td>
</tr>
</xsl:template>
</xsl:stylesheet>
XML.xml文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<根节点>
<节点>
<子节点1>第一列01</子节点1>
<子节点2>第二列01</子节点2>
</节点>
<节点>
<子节点1>第一列02</子节点1>
<子节点2>第二列02</子节点2>
</节点>
</根节点>
程序代码如下:
class Program
{
static void Main(string[] args)
{
XslCompiledTransform trans = new XslCompiledTransform();
trans.Load(@"..\..\XML\XSLTFile.xslt");//加载XSLT文件
trans.Transform(@"..\..\XML\XML.xml", @"..\..\XML\HTML.html");//转换HTML文件
Console.WriteLine("OK!");
Console.Read();
}
}
注意:XSLT文件的语法可以到http://www.w3school.com.cn/xsl/网站学习!
(3)使用XsltArgumentList类绑定对象到命名空间
XSLTFile.xslt文件内容如下,注意修改的部分:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
xmlns:Test="urn:XslTest">
<xsl:template match="/">
<html>
<head><title>李志伟</title></head>
<body><table border="1"><xsl:apply-templates/></table></body>
</html>
</xsl:template>
<xsl:template match="根节点">
<xsl:apply-templates select="节点"/>
</xsl:template>
<xsl:template match="节点">
<tr>
<td><xsl:apply-templates select="子节点1"/></td>
<td><xsl:apply-templates select="子节点2"/></td>
<td><xsl:value-of select="Test:ShowText()"/></td>
</tr>
</xsl:template>
</xsl:stylesheet>
XML文件不变,程序代码如下:
class Test
{
private int Count = 0;
public string ShowText()
{
return "李志伟,行数:" + (Count++);
}
}
class Program
{
static void Main(string[] args)
{
XPathDocument xml = new XPathDocument(@"..\..\XML\XML.xml");
XslCompiledTransform trans = new XslCompiledTransform();
trans.Load(@"..\..\XML\XSLTFile.xslt");//加载XSLT文件
XmlWriter xw = new XmlTextWriter(@"..\..\XML\HTML.html", Encoding.UTF8);
XsltArgumentList arg = new XsltArgumentList();
Test test = new Test();
arg.AddExtensionObject("urn:XslTest", test);//绑定对象参数
XPathNavigator nav = xml.CreateNavigator();
trans.Transform(nav, arg, xw);//生成文件
xw.Close();
Console.WriteLine("OK!");
Console.Read();
}
}
(4)调试XSLT
使用VS 2010可以调试XSLT转换XML文件的过程,可以在VS 2010 XSLT文件编辑器中下断点。也可以使用:XslCompiledTransform trans = new XslCompiledTransform(true)的方式,在运行时调试。
注意:本节只是介绍使用XSLT转换数据格式的基本使用,不做深入研究,更详细信息请查看本人的其它相关文档。
6.在XML中序列化对象
(1).NET对象序列化的方式介绍
二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下。
XML序列化:对象序列化之后的结果是XML形式的,通过XmlSerializer 类来实现的,这个类位于System.Xml.Serialization命名空间下。XML序列化不能序列化私有数据。
SOAP序列化:对象序列化之后的结果符合SOAP协议,也就是可以通过SOAP 协议传输,通过System.Runtime.Serialization.Formatters.Soap命名空间下的SoapFormatter类来实现的。
(2)使用XmlSerializer序列化与反序列化
public class Test//被序列化对象
{
[XmlAttribute]
public string ID { set; get; }
[XmlElement]
public string Name { set; get; }
[XmlElement]
public int Age { set; get; }
[XmlElement]
public string Sex { set; get; }
[XmlElement]
public List<string> Interest { set; get; }
public override string ToString()
{
return "ID:" + ID + ",Name" + Name + ",Age" + Age + ",Sex" + Sex;
}
}
class Program
{
static void Main(string[] args)
{
//创建对象
Test test = new Test() { ID = "01", Name = "李志伟", Age = 20, Sex = "男" };
test.Interest = new List<string>();
test.Interest.Add("看电影");
test.Interest.Add("听歌");
test.Interest.Add("看书");
//序列化
XmlTextWriter xmlw = new XmlTextWriter(@"..\..\XML\XML.xml", Encoding.UTF8);
XmlSerializer xmlser = new XmlSerializer(typeof(Test));
xmlser.Serialize(xmlw, test);//序列化
xmlw.Close();//关闭文件
Console.WriteLine("序列化成功,请查看XML文件!");
Console.ReadLine();
//反序列化
XmlTextReader xmlr = new XmlTextReader(@"..\..\XML\XML.xml");
Test temp = (Test)xmlser.Deserialize(xmlr);//反序列化
xmlr.Close();
Console.WriteLine("反序列化结果:" + temp);
Console.Read();
}
}
注意:本节只是介绍对象序列化成XML的基本方式,不做深入研究,更详细信息请查看本人的其它相关文档。
7.使用LINQ查询XML文档
(1)System.Xml.Linq命名空间
包含LINQ to XML的类。LINQ to XML是内存中的XML编程接口,使您可以轻松有效地修改XML文档。使用LINQ to XML可以进行以下操作:从文件或流加载XML;将XML序列化为文件或流;使用功能构造从头创建XML树;使用LINQ查询来查询XML树;操作内存中的XML树;使用XSD验证XML树。组合使用这些功能将XML树从一种形状转换为另一种形状。
System.Xml.Linq命名空间较重要的类:
XDocument
|
表示 XML 文档。
|
XComment
|
表示一个 XML 注释。
|
XNamespace
|
表示一个 XML 命名空间。无法继承此类。
|
XNode
|
表示 XML 树中节点的抽象概念(元素、注释、文档类型、处理指令或文本节点)。
|
XElement
|
表示一个 XML 元素。
|
XAttribute
|
表示一个 XML 属性。
|
XName
|
表示 XML 元素或属性的名称。
|
XText
|
表示一个文本节点。
|
(2)System.Xml.Linq命名空间类的基本使用
class Program
{
static void Main(string[] args)
{
XDocument xml = XDocument.Load(@"..\..\XML\XML.xml"); ;
Console.WriteLine(xml.Root.Name);//根节点名
Console.WriteLine(xml.Root.LastAttribute);//最后一个属性
XNamespace ns = "http://www.cnblogs.com/LiZhiW/";
XElement root = new XElement(ns + "根节点",
new XElement("节点", "节点内容"),
new XElement("节点",
new XElement("子节点", "子节点内容AAA"),
new XElement("子节点", "子节点内容BBB")));
XComment com = new XComment("标准XML注释");//XML注释
root.Add(com);//加入XML注释
XAttribute atu = new XAttribute("作者","李志伟");//XML属性
root.Add(atu);//加入XML属性
root.Save(@"..\..\XML\XML.xml");
Console.WriteLine("OK!");
Console.Read();
}
}
(3)查询静态的XML文档
使用的XML文件内容:
<?xml version="1.0" encoding="utf-8"?>
<根节点>
<节点>
<子节点1>第一列01</子节点1>
<子节点2>第二列01</子节点2>
</节点>
<节点>
<子节点1>第一列02</子节点1>
<子节点2>第二列02</子节点2>
</节点>
</根节点>
程序代码如下:
class Program
{
static void Main(string[] args)
{
XDocument xml = XDocument.Load(@"..\..\XML\XML.xml"); ;
var query = from element in xml.Descendants("子节点2") select element.Value;
foreach (string s in query)
{
Console.WriteLine(s);
}
Console.Read();
}
}
(4)查询动态的XML
class Program
{
static void Main(string[] args)
{
XDocument xml = XDocument.Load(@"http://geekswithblogs.net/evjen/Rss.aspx");
Console.WriteLine("已加载动态的XML");
var query = from element in xml.Descendants("title") select element.Value;
foreach (string s in query)
{
Console.WriteLine(s);
}
Console.WriteLine("OK!");
Console.Read();
}
}
注意:本节只是介绍Linq to Xml的基本使用,不做深入研究,更详细信息请查看本人的其它相关文档。