基于C#中XmlReader读取Xml的深入分析

所属分类: 软件编程 / C#教程 阅读数: 82
收藏 0 赞 0 分享
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的结束标签
更多精彩内容其他人还在看

C# SendInput 模拟鼠标操作的实现方法

C# SendInput 模拟鼠标操作的实现方法,需要的朋友可以参考一下
收藏 0 赞 0 分享

C#中 paint()与Onpaint()的区别

paint是事件onpaint方法onpaint方法是调用paint事件的,用哪一个,效果是一样,就看那一个方便了内部是这样实现的:
收藏 0 赞 0 分享

c#中GetType()与Typeof()的区别

c#中GetType()与Typeof()的区别,需要的朋友可以参考一下
收藏 0 赞 0 分享

将字符串转换成System.Drawing.Color类型的方法

将字符串转换成System.Drawing.Color类型的方法,需要的朋友可以参考一下
收藏 0 赞 0 分享

C# 抓取网页内容的方法

C# 抓取网页内容的方法,需要的朋友可以参考一下
收藏 0 赞 0 分享

基于C#后台调用跨域MVC服务及带Cookie验证的实现

本篇文章介绍了,基于C#后台调用跨域MVC服务及带Cookie验证的实现。需要的朋友参考下
收藏 0 赞 0 分享

使用C#获取远程图片 Form用户名与密码Authorization认证的实现

本篇文章介绍了,使用C#获取远程图片 Form用户名与密码Authorization认证的实现。需要的朋友参考下
收藏 0 赞 0 分享

Winform跨线程操作的简单方法

线程间操作无效:从不是创建控件“label1”的线程访问它
收藏 0 赞 0 分享

C# WINFORM 强制让窗体获得焦点的方法代码

C# WINFORM 强制让窗体获得焦点的方法代码,需要的朋友可以参考一下
收藏 0 赞 0 分享

C#中方括号[]的语法及作用介绍

C#中方括号[]可用于数组,索引、属性,更重要的是用于外部DLL类库的引用。
收藏 0 赞 0 分享
查看更多