使用XmlReader读Xml

XmlDocument和XElement在读取Xml时要将整个Xml文档放到内存中去操作,这样做操作简单,但是很费内存和IO(可能是磁盘IO或者网络IO);而在有些场景下我们必须考虑尽可能节省内存和IO的开销,这时候就该XmlReader和XmlWriter出场了。
XmlReader读取Xml需要通过Read()实例方法,不断读取Xml文档中的声明,节点开始,节点内容,节点结束,以及空白等等,直到文档结束,Read()方法返回false。

如下读取Xml内容实例代码和注释说明

[csharp]  view plain copy
  1. //玉开技术博客:http://blog.csdn.net/yukaizhao  
  2. using System;  
  3. using System.Collections.Generic;  
  4. using System.Text;  
  5. using System.Xml;  
  6. using System.IO;  
  7.   
  8. namespace UseXmlReader  
  9. {  
  10.     class Program  
  11.     {  
  12.         static void Main(string[] args)  
  13.         {  
  14.             //声明StringReader传入Xml文本,作为XmlReader.Create的参数  
  15.             using (StringReader strRdr = new StringReader(@"<?xml version=""1.0"" encoding=""utf-8"" ?>  
  16. <root>  
  17.     <cat color=""white"">I'm a Cat</cat>  
  18.     <dog color=""yellow""/>  
  19. </root>"))  
  20.             {  
  21.                 //通过XmlReader.Create静态方法创建XmlReader实例  
  22.                 using (XmlReader rdr = XmlReader.Create(strRdr))  
  23.                 {  
  24.                     //循环Read方法直到文档结束  
  25.                     while (rdr.Read())  
  26.                     {  
  27.                         Console.WriteLine("rdr.NodeType = " + rdr.NodeType);  
  28.                         //如果是开始节点  
  29.                         if (rdr.NodeType == XmlNodeType.Element) {  
  30.                             //通过rdr.Name得到节点名  
  31.                             string elementName = rdr.Name;  
  32.                               
  33.                             Console.WriteLine(elementName + " element start");  
  34.                             if (elementName == "root") {  
  35.   
  36.                             }  
  37.                             //读取到cat元素 这时rdr.Read()读取到的内容为<cat color="white">  
  38.                             else if (elementName == "cat")  
  39.                             {  
  40.                                 //可以通过中括号获得属性值  
  41.                                 string colorVal = rdr["color"];  
  42.                                 Console.WriteLine("\tcat's color is " + colorVal);  
  43.   
  44.                                 //读取到节点内文本内容  
  45.                                 if(rdr.Read()) {  
  46.                                     //通过rdr.Value获得文本内容  
  47.                                     Console.WriteLine("\t cat said:" + rdr.Value);  
  48.                                 }  
  49.                             }  
  50.                         }  
  51.                         else if (rdr.NodeType == XmlNodeType.EndElement)  
  52.                         {  
  53.                             //在节点结束时也可以通过rdr.Name获得节点名字  
  54.                             string elementName = rdr.Name;  
  55.                             Console.WriteLine(elementName + " element end");  
  56.                         }  
  57.                     }  
  58.                 }  
  59.             }  
  60.   
  61.             Console.Read();  
  62.         }  
  63.     }  
  64. }  

如果觉得代码不明白,下面是一张读取顺序图,标明了读取顺序号和每次读取的内容,如下图所示:

使用XmlReader读Xml_第1张图片


从图中可以看到XmlReader在读取这段Xml时:
第1次Read()读取的是Xml文档声明部分
第2次Read()读取的是声明后的空白
第3次Read()读取的是根节点root的开始标签
第4次Read()读取的是根节点开始后的空白
第5次Read()读取的是cat节点的开始部分,从左尖括号到右尖括号包括该节点的属性
第6次读取的是cat节点的内容
第7次读取的是cat节点的结束标签
第8次读取的是cat节点结束标签后的空白
第9次读取的是dog节点的开始部分,注意是从左尖括号开始到结束斜杠之前
第10次读取的是dog标签的结束/>
第11次读取的是dog标签结束后的空白
第12次读取的是root的结束标签

你可能感兴趣的:(使用XmlReader读Xml)