国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

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

2020-01-24 03:18:17
字體:
供稿:網(wǎng)友
XmlDocument和XElement在讀取Xml時要將整個Xml文檔放到內(nèi)存中去操作,這樣做操作簡單,但是很費內(nèi)存,而在有些場景下我們必須考慮盡可能節(jié)省內(nèi)存.這時候就該XmlReader和XmlWriter出場了。
XmlReader讀取Xml需要通過Read()實例方法,不斷讀取Xml文檔中的聲明,節(jié)點開始,節(jié)點內(nèi)容,節(jié)點結(jié)束,以及空白等等,直到文檔結(jié)束,Read()方法返回false。
如下讀取Xml內(nèi)容實例代碼和注釋說明
復(fù)制代碼 代碼如下:

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的參數(shù)
            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靜態(tài)方法創(chuàng)建XmlReader實例
                using (XmlReader rdr = XmlReader.Create(strRdr))
                {
                    //循環(huán)Read方法直到文檔結(jié)束
                    while (rdr.Read())
                    {
                        Console.WriteLine("rdr.NodeType = " + rdr.NodeType);
                        //如果是開始節(jié)點
                        if (rdr.NodeType == XmlNodeType.Element) {
                            //通過rdr.Name得到節(jié)點名
                            string elementName = rdr.Name;

                            Console.WriteLine(elementName + " element start");
                            if (elementName == "root") {

                            }
                            //讀取到cat元素 這時rdr.Read()讀取到的內(nèi)容為<cat color="white">
                            else if (elementName == "cat")
                            {
                                //可以通過中括號獲得屬性值
                                string colorVal = rdr["color"];
                                Console.WriteLine("/tcat's color is " + colorVal);

                                //讀取到節(jié)點內(nèi)文本內(nèi)容
                                if(rdr.Read()) {
                                    //通過rdr.Value獲得文本內(nèi)容
                                    Console.WriteLine("/t cat said:" + rdr.Value);
                                }
                            }
                        }
                        else if (rdr.NodeType == XmlNodeType.EndElement)
                        {
                            //在節(jié)點結(jié)束時也可以通過rdr.Name獲得節(jié)點名字
                            string elementName = rdr.Name;
                            Console.WriteLine(elementName + " element end");
                        }
                    }
                }
            }

            Console.Read();
        }
    }
}
如果覺得代碼不明白,下面是一張讀取順序圖,標明了讀取順序號和每次讀取的內(nèi)容,如下圖所示:



從圖中可以看到XmlReader在讀取這段Xml時:
第1次Read()讀取的是Xml文檔聲明部分
第2次Read()讀取的是聲明后的空白
第3次Read()讀取的是根節(jié)點root的開始標簽
第4次Read()讀取的是根節(jié)點開始后的空白
第5次Read()讀取的是cat節(jié)點的開始部分,從左尖括號到右尖括號包括該節(jié)點的屬性
第6次讀取的是cat節(jié)點的內(nèi)容
第7次讀取的是cat節(jié)點的結(jié)束標簽
第8次讀取的是cat節(jié)點結(jié)束標簽后的空白
第9次讀取的是dog節(jié)點的開始部分,注意是從左尖括號開始到結(jié)束斜杠之前
第10次讀取的是dog標簽的結(jié)束/>
第11次讀取的是dog標簽結(jié)束后的空白
第12次讀取的是root的結(jié)束標簽
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 江北区| 莒南县| 韶山市| 昭通市| 三亚市| 阿勒泰市| 华容县| 康定县| 中方县| 四会市| 忻城县| 宝山区| 太保市| 禄丰县| 新巴尔虎右旗| 遂昌县| 乌兰浩特市| 天津市| 鹤峰县| 巴楚县| 如东县| 玉林市| 仁怀市| 弋阳县| 隆安县| 醴陵市| 泰和县| 合山市| 亳州市| 克什克腾旗| 黄浦区| 崇礼县| 镇宁| 两当县| 渝中区| 嘉定区| 永定县| 永宁县| 额尔古纳市| 略阳县| 繁峙县|