XmlReader提供了对XML文件内容的快速、只向前的访问,但不适用于对文件内容或者结构做修改(你可以使用XmlDocument类来实现)。XmlReader类从文件的顶部开始读取数据,每次读取一个节点。当读取了节点之后,你可以忽略该节点,也可以按照应用程序的需求指示而访问节点信息。
适用XmlReader类的步骤如下:
(1) 适用XmlReader类的Create()方法创建该类的一个实例,并将被读取的XML文件名称作为参数传入方法。
(2) 建立一个反复调用Read()方法的循环。这个方法从文件的第一个节点开始,然后读取所有余下的节点,但每次调用只读取一个节点。如果存在一个节点可被读取则返回True,而当到达文件最后时则返回False.
(3) 在这个循环中,将检查XmlReader对象的属性和方法,以获得关于当前节点的信息(它的类型、名称、数据等等)。不断地执行该循环直到Read()返回False。
1. 开始读取文档
要开始读取XML文档,你可以任意使用一个Read()方法从文档中获取数据。比如,下面这段代码使用了ReadStaretElement()移动至文档的第一个元素:
XmlReader reader=XmlReader.Create(Employees.xml);
Reader.ReadStaretElement();
或者可以调用MoveToContent()方法直接跳至文档内容,如果当前节点不是内容节点则跳至下一个内容节点(内容节点CDATA、Element、Entity和EntityReference)。如果位于属性上,读取器将会返回至包含该属性的元素
XmlReader reader=XmlReader.Create(Employees.xml);
Reader.MoveToContent();
上面的示例中,如果Employees.xml如下所示:
<?xml version=”1.0” ?>
<!—Employees Details-->
<firstname>Nance</firstname>
2. 读取元素
Read()、ReadString()、ReadStartElement()、ReadEndElement()方法都能用于从xml源中读取Element节点,在读取元素之后,每一个方法都将跳至文档中的下一个节点。与这些方法相对的是MoveToElement()方法只是下一个Element,而并不读取它。
Read()方法是最简单的:无论是否是Element节点,它都读取源中的下一个节点。当使用这个方法的时候,您应该检查节点的名称和类型,以便确认您处理的是正确的节点。例如,下面的代码使用了Read()方法和XmlReader的NodeType属性,仅读取Comment节点:
XmlReader reader = XmlReader.Create("Employees.xml");
//Read the nodes in a loop
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Comment) //Reader.NodeType获取当前节点的类型
{
//Code to process Comments
}
}
在使用XmlReader对象读取XML文档的时候,如果您检查XmlReader对象的ReadState属性,将会发现它根据XmlReader的状态提供了不同的值。表4-4总结了XmlReader在读取XML文档的不同部分时出现的状态。
3. 读取属性
当你打算读取元素中的属性时,应当首先使用HasAttributes属性来确保该元素节点中含有属性。元素节点中的属性可以通过其名称或索引来直接访问。还可以通过MoveToAttribute(),MoveToFirstAttribure()和MoveToNextAttribute()方法来访问。
例如,为了通过名称来处理属性,你可以使用该属性的名称来调用MoveToAttribute()
XmlReader reader=XmlReader.Create(“Employees.xml”);
//Move to first element
Reader.MoveToElement();
If(reader.hasAttributes)
{
Reader.MoveToAttribute(“id”)
//Code to do something with the attribute value stored in id attribute.
}
4. 读取内容和其他数据
你的应用程序可以使用ReadString()方法读取当前节点内容作为字符串。还可以使用各种形式的ReadElementContentAsXXX方法来读取文档的内容。除了这些方法之外,使用ReadContentAsXXX方法可以在当前位置上读取文本内容。例如,通过使用ReadContentAsDouble()方法,您可以读取当前位置上的文本内容为Double值。根据读取器当前所在位置上的元素,ReadString()具有不同的表现。
如果当前节点是Element节点,ReadString()将连接Element节点内的所有文本、有意义的空白、空白和CDATA区域节点类型,并返回连接后的数据,作为Element节点的内容。
● 如果当前节点是Text节点,ReadString()将像Element节点一样,在Text节点的结束标签上执行相同的连接操作。
● 如果当前节点是Attribute节点,ReadString()的表现就像读取器正位于Element节点的开始标签上一样,并返回与Element节点一样的数据。
● 对所有其他节点类型,ReadString()将返回一个空字符串。
5. 使用XmlReader读取Xml文件。
演示如何使用XmlReader对象来读取XML文档。这个简单的示例利用XmlReader类的功能来解析一个名为Employees.xml的静态XML文件。程序清单4-1显示了一个XML文件,是一家企业的员工列表。
程序清单4-1 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>
</employees>
现在你已经看到了Employees.xml文件的内容,现在用ASP.NET来处理这个文件。
string xmlFilePath = @"C:/Data/Employees.xml";
try
{
//Get reference to the XmlReader object
using (XmlReader reader = XmlReader.Create(xmlFilePath))
{
string result;
while (reader.Read())
{
//Process only the elements
if (reader.NodeType == XmlNodeType.Element)
{
//Reset the variable for a new 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;
}