XmlReader通过向前读取文档并识别读取到的元素,为我们提供了一种消耗资源最少的方式来解析XML数据。很多时候我们都是利用XmlReader来对XML文件的数据有效性进行验证(使用XmlReader实例的Read()方法依次读取所有节点,以此判断是否与符合指定的模式)。使用这种非缓存、只读、只向前的方式,每次读取只将很少的数据放入内存,对内存的占用量较小,对于读取内容较大的XML文件不失为一种最佳的选择。
让我们看看XmlReader类读取XML文件的步骤:
1、使用XmlReader类的Create()工厂方法创建该类的一个实例,并将被读取的XML文件名作为参数传入方法;
2、建立一个反复调用Read()方法的循环。这个方法从文件的第一个节点开始,然后读取所有余下的节点,但每次调用只读取一个节点。如果存在一个节点可被读取则返回True,而当到达文件最后时则返回False;
3、在这个循环中,将检查XmlReader实例的属性和方法,以获得关于当前节点的信息(节点的类型、名称、数据等)。不断执行循环直到Read()返回False;
下面首先看一个示例:
Employees.xml文件:
<?xml version='1.0'?> <employees> <employee id="1"> <name> <firstName>Nancy</firstName> <lastName>Davolio</lastName> </name> <city>Seattle</city> <state>WA</state> <zipCode>98122</zipCode> </employee> <employee id="2"> <name> <firstName>Andrew</firstName> <lastName>Fuller</lastName> </name> <city>Tacoma</city> <state>WA</state> <zipCode>98401</zipCode> </employee> </employees></div>
aspx代码:
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Xml" %>
<script runat="server">
void Page_Load(object sender, EventArgs e)
{
//Location of XML file
string xmlFilePath = Server.MapPath("~/Employees.xml");
try
{
using (XmlReader reader = XmlReader.Create(xmlFilePath))
{
string result;
while (reader.Read())
{
//Process only the elements
if (reader.NodeType == XmlNodeType.Element)
{
result = "";
for (int count = 1; count <= reader.Depth; count++)
{
result += "===";
}
result += "=> " + reader.Name + "<br/>";
lblResult.Text += result;
}
}
}
}
catch (Exception ex)
{
lblResult.Text = "An Exception occurred: " + ex.Message;
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Reading an XML File using XmlReader</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:label id="lblResult" runat="server" />
</div>
</form>
</body>
</html>
</div>
输出结果:
=> employees
====> employee
=======> name
==========> firstName
==========> lastName
=======> city
=======> state
=======> zipCode
====> employee
=======> name
==========> firstName
==========> lastName
=======> city
=======> state
=======> zipCode
下面让我们看看XmlReader类的属性和方法:
| 属 性 | 说 明 |
|---|---|
| AttributeCount | 返回当前节点的属性个数 |
| Depth | 返回当前节点的深度,用于判断指定的节点是否具有子节点 |
| EOF | 判断读取器是否位于流的末端 |
| HasAttribute | 返回指示当前节点是否具有属性的布尔值 |
| HasValue | 返回指示当前节点是否具有值的布尔值 |
| IsEmptyElement | 判断当前节点是否是一个空元素 |
| LocalName | 返回当前节点的本地名称 |
| Name | 返回当前节点的限定名称 |
| NamespaceURI | 返回当前节点的命名空间URI |
| NodeType | 以XmlNodeType枚举的形式返回当前节点的节点类型 |
| Prefix | 返回与当前节点相关的命名空间前缀 |
| ReadState | 以ReadState枚举的形式返回读取器的当前状态 |
| Settings | 返回用于创建XmlReader实例的XmlReaderSettings对象 |
| Value | 返回当前节点的值 |
| ValueType | 获得当前节点的CLR类型 |
XmlReader类的重要方法:
| 方 法 | 说 明 |
|---|---|
| Close | 通过将ReadState枚举设置为Closed来关闭Xmlreader对象 |
| Create | 创建XmlReader对象的实例并将其返回给调用程序 |
| GetAttribute | 获得属性的值 |
| IsStartElement | 指示当前节点是否是开始标签 |
| MoveToAttribute | 移动读取器到指定的属性 |
| MoveToContent | 如果当前节点不是内容节点,则移动读取器至下一个内容节点 |
| MoveToElement | 移动读取器至包含当前属性的元素;用于列举属性以及想切换至包含所有这些属性的元素 |
| MoveToFirstAttribute | 移动读取器至当前节点的第一个属性 |
| MoveToNextAttribute | 移动读取器至当前节点的下一个属性 |
| Read | 从流中读取下一个节点 |
| ReadContentAs | 读取提供类型的对象的内容 |
| ReadElementContentAs | 读取当前元素并返回指定类型对象的内容 |
| ReadEndElement | 移动读取器越过当前结束标签并移动到下一个节点 |
| ReadInnerXml | 以字符串的形式读取包括标记在内的当前节点所有内容 |
| ReadOutXml | 读取包括当前节点标记和子节点在内的节点的内容 |
| ReadToDescendant | 移动读取器至下一个匹配子孙元素的节点 |
| ReadToFollowing | 不断读取直至找到指定的元素 |
| ReadToNextSlibing | 移动读取器至下一个匹配兄弟元素的节点 |
| ReadValueChunk | 允许读取嵌入在XML文档中的大型文
您可能想查找下面的文章:文章分类 |

