XmlReader类读取XML文件

 

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()方法直接跳至文档内容,如果当前节点不是内容节点则跳至下一个内容节点(内容节点CDATAElementEntityEntityReference)。如果位于属性上,读取器将会返回至包含该属性的元素

   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()方法和XmlReaderNodeType属性,仅读取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;

    } 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值