基于C#中XmlReader读取Xml的深入分析
发布时间:2020-12-15 04:16:15 所属栏目:百科 来源:网络整理
导读:XmlDocument和XElement在读取Xml时要将整个Xml文档放到内存中去操作,这样做操作简单,但是很费内存,而在有些场景下我们必须考虑尽可能节省内存.这时候就该XmlReader和XmlWriter出场了。 XmlReader读取Xml需要通过Read()实例方法,不断读取Xml文档中的声明,
XmlDocument和XElement在读取Xml时要将整个Xml文档放到内存中去操作,这样做操作简单,但是很费内存,而在有些场景下我们必须考虑尽可能节省内存.这时候就该XmlReader和XmlWriter出场了。 XmlReader读取Xml需要通过Read()实例方法,不断读取Xml文档中的声明,节点开始,节点内容,节点结束,以及空白等等,直到文档结束,Read()方法返回false。 如下读取Xml内容实例代码和注释说明 复制代码 代码如下: using System; using System.Collections.Generic; using System.Text; using System.Xml; using System.IO; namespace UseXmlReader { class Program { static void Main(string[] args) { //声明StringReader传入Xml文本,作为XmlReader.Create的参数 using (StringReader strRdr = new StringReader(@"<?xml version=""1.0"" encoding=""utf-8"" ?> <root> <cat color=""white"">I'm a Cat</cat> <dog color=""yellow""/> </root>")) { //通过XmlReader.Create静态方法创建XmlReader实例 using (XmlReader rdr = XmlReader.Create(strRdr)) { //循环Read方法直到文档结束 while (rdr.Read()) { Console.WriteLine("rdr.NodeType = " + rdr.NodeType); //如果是开始节点 if (rdr.NodeType == XmlNodeType.Element) { //通过rdr.Name得到节点名 string elementName = rdr.Name; Console.WriteLine(elementName + " element start"); if (elementName == "root") { } //读取到cat元素 这时rdr.Read()读取到的内容为<cat color="white"> else if (elementName == "cat") { //可以通过中括号获得属性值 string colorVal = rdr["color"]; Console.WriteLine("tcat's color is " + colorVal); //读取到节点内文本内容 if(rdr.Read()) { //通过rdr.Value获得文本内容 Console.WriteLine("t cat said:" + rdr.Value); } } } else if (rdr.NodeType == XmlNodeType.EndElement) { //在节点结束时也可以通过rdr.Name获得节点名字 string elementName = rdr.Name; Console.WriteLine(elementName + " element end"); } } } } Console.Read(); } } } 如果觉得代码不明白,下面是一张读取顺序图,标明了读取顺序号和每次读取的内容,如下图所示: 从图中可以看到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的结束标签 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |