.NET中对XML读写进行了很好的支持,在.NET Framework中Xml命名空间下提供了很多类来对XML文件进行读写等操作。在需要读写XML文件时时我们可以在代码顶部输入using System.Xml 来告诉编译器和运行时环境我们需要使用此命名空间下的类。
首先回顾下关于XML的基本信息:
1.XML 全称 Extensible Makeup Language 扩展标记语言,可以用来存储格式化的数据。
2.XML 是基于(elements)元素的
3.element由开始标记,元素内容以及结束标记组成。
4.元素的属性可以存储当前标签的信息。
以下是XML示例代码片段,这里我们存储了关于章节的信息,我们存储了两个章节,并存储了他们的标题:
<chapters total="2">
<chapter>Data Types, Variables and Operators</chapter>
<chapter>Language Fundamentals</chapter>
</chapters>
了解.Net Framework中XML读写相关的类:
1.XmlWriter类 我们使用这个类把XML写入文件或者内存中,它的常用方法及属性如下:
Create方法 创建一个新的实例,调用时传入XML文件的名称作为参数。
WriteStartDocument方法 输出XML的定义头:类似 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
WriteStartElement方法 输出元素开始部分,就是上边XML示例中的<chapters total="2">这行。
WriteEndElement 方法 输出元素结束部分 </chapters>
WriteElementString方法 一次性输出包括元素开始部分,元素内容和元素结束部分。可以一次性输出后面的内容,<chapter>Language Fundamentals</chapter>
2.XmlWriterSettings类 我们使用这个类来设置我们写入XML的一些格式信息。
Indent属性 可以设置为true或者false 来设置当我们写入XML的元素时,元素是否使用缩进。
IndentChars属性 可以定义我们使用缩进时使用的分隔符。
NewLineChars属性 定义我们写入元素时换行使用的字符。
3.XmlReader类 我们使用这个类来读取文件或内存中的XML文件,它的常用方法及属性如下:
Create方法 创建一个新的XML文件引用实例,调用时传入XML文件的名称作为参数。
Read方法 一次读取一个元素的节点,返回true或者false
NodeType属性 判断当前Read方法读取的标记节点类型,是element还是文本。
ReadToFollowing方法 传递一个我们要查找的element名称作为参数, 和Read方法基本一样,只是我们这里是要找寻特定名称的element
示例代码如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Xml;
namespace UsingNetFramework
{
class Program
{
static void Main(string[] args)
{
static void WriteAndReadXML() // 这里只定义了一个静态方法,执行下面的代码块
{
// 首先new一个XmlWriterSettings类的实例,起个名字叫settings,用来定义使用XmlWriter类来输出XML的格式设置。
XmlWriterSettings settings = new XmlWriterSettings();
// 设置settings对象的Indent属性为true,这样在使用XmlWriter输出XML时会自动使用缩进
// 如果这里设置成false则输出的XML文件会没有任何换行缩进等格式
settings.Indent = true;
// 设置换行字符
settings.NewLineChars = "/r/n";
// 通过调用XmlWriter类的静态方法Create来新建一个写XML文件的writer对象,如果文件已经存在会覆盖他里面的内容。
// 调用这个方法传进了两个参数,第一个是字符串型,为我们要创建的文件的名称,包括要存放的位置的全路径。
// 第二个参数是我们在上边创建的settings对象,这样可以让writer使用我们定义好的格式来输出XML。
XmlWriter writer = XmlWriter.Create("c://test.xml", settings);
writer.WriteStartDocument(true); //输出XML的定义头:类似 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
writer.WriteStartElement("chapters"); //输出chapters元素的开始标签<chapters>
// 下面一行代码为上一行代码输出的chapters元素添加一个属性,这样我们实际看到的效果应该是<chapters total="2">
writer.WriteAttributeString("total", "2");
// 下面一行代码一次输出了一个完整的元素,一次性输出包括元素开始部分,元素内容和元素结束部分。
// 输出效果所示:<chapter>Data Types, Variables and Operators</chapter>
writer.WriteElementString( "chapter", "Data Types, Variables and Operators");
writer.WriteElementString( "chapter", "Language Fundamentals");
// 输出chatpers元素的结束部分</chapters>
writer.WriteEndElement();
// 结束我们的输出,文件在我们使用Create方法时已经在硬盘中生成,但是只有当我们调用了Close方法后以上内容才会真正输出到文本文件中。
writer.Close();
/// 上面的部门示例了写XML的一般方法,下面则是读取XML的一般方法
// 读取XML文件我们使用XmlReader类,首先也需要使用XmlReader的Create方法来新建一个XmlReader的对象,
// 这实际上是我们XML文件的一个引用,方法的参数为我们要读取文件的名称包括其全路径。
XmlReader reader = XmlReader.Create("c://test.xml"); ///"c://test.xml"中的//是使用了转义字符
// Read the XML one node at a time
// 这里使用了一个while循环,如果reader对象的Read方法返回true,说明我们读取到了XML文件中的节点信息
// 返回false的时候说明我们已经读取完所有信息。可以这么理解,使用一次Read方法如果读到数据,即把当前读到的节点
// 数据保存到reader对象中,然后我们就可以调用reader对象的属性来读取当前读到的节点的信息。
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Text)
{
Console.WriteLine(reader.Value);
}
}
// 当我们读取完毕需要使用Close方法来关闭这个读取流。
reader.Close();
Console.WriteLine();
// 上面演示了XmlReader的Read方法,下面是XmlReader类的ReadToFollowing方法的示例
// 同样需要使用XmlReader的Create方法来新建一个XmlReader的对象,可能有人会问为什么上面已经新建了一个
// XmlReader的对象,而这里不能直接使用呢。这是因为无论是使用Read方法还是ReadToFollowing方法,读取
// XML的顺序都是从上到下而不能回到顶部重新读取的。所以每次需要重新读取XML文件都需要新建一个XmlReader类的对象。
reader = XmlReader.Create("c://test.xml");
// 区别于Read方法依次读取XML的每个节点信息,ReadToFollowing方法可以读取特定名称的节点的信息
// 这里选择只读取元素名称为chapter的元素节点。
while (reader.ReadToFollowing("chapter"))
{
// 读到一个元素节点后我们可以使用它的信息进行操作,这里输出了这个元素的内容
Console.WriteLine(reader.ReadInnerXml());
}
// 关闭读取流
reader.Close();
}
}
}
}