zoukankan      html  css  js  c++  java
  • 使用XmlReader读Xml

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

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

    //玉开技术博客:http://blog.csdn.net/yukaizhao
    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("	cat's color is " + colorVal);
    
                                    //读取到节点内文本内容
                                    if(rdr.Read()) {
                                        //通过rdr.Value获得文本内容
                                        Console.WriteLine("	 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的结束标签

    .Net处理Xml相关随笔


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

    [转载自csdn]

  • 相关阅读:
    maven完成构建后,eclipse导入运行maven web
    maven构建java项目的过程【完全】
    maven配置【转载】
    iOS - 移动设备防丢失App
    iOS
    iOS
    iOS
    iOS
    iOS
    iOS
  • 原文地址:https://www.cnblogs.com/roboot/p/4772009.html
Copyright © 2011-2022 走看看