C# 操作讀取XML的類之間的比較

下面列出微軟.net類庫提供的讀寫xml文件個類及其特點:

類名稱 優點 缺點
XmlReader 快速、高效、可擴展 只讀,只向前,需要人工驗證
XmlDocument 可往返、可讀寫、支持XPath篩選 比XmlReader慢
XPathNavigator 可往返,支持XPath和XSLT 只讀
XPathDocument 比XmlDocument,優化支持XPath和XSLT 比XmlReader慢

本文提到的XmlReader也是微軟類庫中的一個類,它的特點是快速高效,並且可擴展,缺點是隻讀。

本人關於這三個做了一個性能測試

條件:做100000次,每次都進行XML的加載和一個節點的讀取,所共的時間如下

xpath:          03.265625

dom:            02.625

xmlreader:   0.140625

其中xpath和dom比較類似,大部分時間都在加載XML上,節點查找倒是挺快的,而xmlreader則是邊加載邊查找,不需要完全加載完纔開始查找節點,可以用於大容量的XML讀取,便代碼編寫上沒有前兩個快捷

           DateTime dt1, dt2;
            string linkId;
            dt1 = DateTime.Now;
            for (int i = 0; i < 100000; i++)
            {
                linkId = XPathTest(strXml);
            }
            dt2 = DateTime.Now;
            Console.WriteLine("XPathTest: {0}", dt2 - dt1);
            dt1 = DateTime.Now;
            for (int i = 0; i < 100000; i++)
            {
                linkId = DOMTest(strXml);
            }
            dt2 = DateTime.Now;
            Console.WriteLine("DOMTest: {0}", dt2 - dt1);
            dt1 = DateTime.Now;
            for (int i = 0; i < 100000; i++)
            {
                linkId = XmlReaderTest(strXml);
            }
            dt2 = DateTime.Now;
            Console.WriteLine("XmlReaderTest: {0}", dt2 - dt1);
            //XmlStream.Close();
            Console.ReadLine();

#region XPathTest
        static string XPathTest(string strXml)
        {
            XmlDocument XmlDoc = new XmlDocument();
            XmlDoc.LoadXml(strXml);

            //XmlNode linkId0 = XmlDoc.SelectSingleNode("Response/SessionID");
            //XmlNode linkId1 = XmlDoc.SelectSingleNode("Response/Result/Item/LastFeed");
            //XmlNode linkId2 = XmlDoc.SelectSingleNode("Response/Result/Item/LandStatus");
            //XmlNode linkId3 = XmlDoc.SelectSingleNode("Response/Result/Item/AnimalID");
            //XmlNode linkId4 = XmlDoc.SelectSingleNode("Response/Result/Item/RaiseTime");
            //XmlNode linkId5 = XmlDoc.SelectSingleNode("Response/Result/Item/AnimalName");

            XmlNode linkId = XmlDoc.SelectSingleNode("Response/Result/Item/LandID");
            return linkId.InnerXml;
        }
        #endregion

        #region DOMTest
        static string DOMTest(string strXml)
        {
            XmlDocument XmlDoc = new XmlDocument();
            XmlDoc.LoadXml(strXml);

            //XmlNode linkId0 = XmlDoc["Response"]["SessionID"];
            //XmlNode linkId1 = XmlDoc["Response"]["Result"]["Item"]["LastFeed"];
            //XmlNode linkId2 = XmlDoc["Response"]["Result"]["Item"]["LandStatus"];
            //XmlNode linkId3 = XmlDoc["Response"]["Result"]["Item"]["AnimalID"];
            //XmlNode linkId4 = XmlDoc["Response"]["Result"]["Item"]["RaiseTime"];
            //XmlNode linkId5 = XmlDoc["Response"]["Result"]["Item"]["AnimalName"];

            XmlNode linkId = XmlDoc["Response"]["Result"]["Item"]["LandID"];
            return linkId.InnerXml;
        }
        #endregion

        #region XmlReaderTest
        static string XmlReaderTest(string strXml)
        {
            string restr = "";

            MemoryStream XmlStream = new MemoryStream();
            byte[] bytes = Encoding.UTF8.GetBytes(strXml);
            XmlStream.Write(bytes, 0, bytes.Length);
          
            XmlStream.Position = 0;
            XmlTextReader reader = new XmlTextReader(new StreamReader(XmlStream));
            while (reader.Read() && reader.Name != "Response") ;
            while (reader.Read() && reader.Name != "Result") ;
            while (reader.Read() && reader.Name != "Item") ;
            while (reader.Read() && reader.Name != "LandID") ;
            restr = reader.ReadString();

            XmlStream.Close();

            return restr;
        }
        #endregion

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章