C#操作Xml:使用XmlReader讀Xml

來源:互聯網
上載者:User

標籤:

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();        }    }}
如果覺得代碼不明白,下面是一張讀取順序圖,標明了讀取順序號和每次讀取的內容,如所示:可以看到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格式

C#操作Xml:使用XmlReader讀Xml

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.