首页 技术 正文
技术 2022年11月13日
0 收藏 721 点赞 3,746 浏览 3034 个字

XmlDocument和XElement在读取Xml时要将整个Xml文档放到内存中去操作,这样做操作简单,但是很费内存和IO(可能是磁盘IO或者网络IO);而在有些场景下我们必须考虑尽可能节省内存和IO的开销,这时候就该XmlReader和XmlWriter出场了。

XmlReader读取Xml需要通过Read()实例方法,不断读取Xml文档中的声明,节点开始,节点内容,节点结束,以及空白等等,直到文档结束,Read()方法返回false。

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

?

//玉开技术博客:http://www.cnblogs.com/yukaizhaousing 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();        }    }}

如果觉得代码不明白,下面是一张读取顺序图,标明了读取顺序号和每次读取的内容,如下图所示:C#操作Xml:使用XmlReader读Xml从图中可以看到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的结束标签

感谢@Kingthy对文中消耗IO说法提出问题,XmlReader和XmlDocument消耗的IO是一样的;不同的是XmlReader可以读取一点,显示一点,而XmlDocument必须完全读入之后才可以开始处理。

C#处理Xml的相关随笔:

1.通过XmlDocument读写Xml文档2.使用XmlReader读Xml使用XmlWriter写Xml3.使用Linq to xml存取XML4.通过XmlScheme定义固定格式xml文档5.Xml序列化或者反序列化类6.通过XPath查找Xml节点7.通过Xslt转化Xml格式

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,491
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,493
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,132
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,294