日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

XML数据读取方式性能比较(一)

發(fā)布時(shí)間:2025/4/16 asp.net 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 XML数据读取方式性能比较(一) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  幾個(gè)月來(lái),疑被SOA,一直在和XML操作打交道,SQL差不多又忘光了。現(xiàn)在已經(jīng)知道,至少有四種常用人XML數(shù)據(jù)操作方式(好像Java差不多),不過(guò)還沒(méi)有實(shí)際比較過(guò)這些方式各有哪些特點(diǎn)或優(yōu)劣。正好看到網(wǎng)上也沒(méi)有這方面的實(shí)驗(yàn),偶來(lái)總結(jié)一下。

  測(cè)試開(kāi)始先讀取XML源,用一個(gè)比較大的RSS文件鏈接,復(fù)制到項(xiàng)目bin/debug目錄下。

Stream xmlStream = new MemoryStream(File.ReadAllBytes(path));

?   

  一、XmlDocument 方式

代碼 1 static IList testXmlDocument()
2 {
3 var doc = new XmlDocument();
4 doc.Load(xmlStream);
5 var nodeList = doc.DocumentElement.ChildNodes;
6 var lstChannel = new List<Object>(nodeList.Count );
7 foreach (XmlNode node in nodeList)
8 {
9 var channel = new
10 {
11 Title = node.SelectSingleNode("title").InnerText,
12 Link = node.SelectSingleNode("link").InnerText,
13 Description = node.SelectSingleNode("description").InnerText,
14 Content = node.SelectSingleNode("content").InnerText,
15 PubDate = node.SelectSingleNode("pubDate").InnerText,
16 Author = node.SelectSingleNode("author").InnerText,
17 Category = node.SelectSingleNode("category").InnerText
18 };
19 lstChannel.Add(channel);
20 }
21 return lstChannel;
22 }

?

  二、XPathNavigator 方式

代碼 1 static IList testXmlNavigator()
2 {
3 var doc = new XmlDocument();
4 doc.Load(xmlStream);
5 var nav = doc.CreateNavigator();
6 nav.MoveToRoot();
7 var nodeList = nav.Select("/channel/item");
8 var lstChannel = new List<Object>(nodeList.Count);
9 foreach (XPathNavigator node in nodeList)
10 {
11 var channel = new
12 {
13 Title = node.SelectSingleNode("title").Value,
14 Link = node.SelectSingleNode("link").Value,
15 Description = node.SelectSingleNode("description").Value,
16 Content = node.SelectSingleNode("content").Value,
17 PubDate = node.SelectSingleNode("pubDate").Value,
18 Author = node.SelectSingleNode("author").Value,
19 Category = node.SelectSingleNode("category").Value
20 };
21 lstChannel.Add(channel);
22 }
23 return lstChannel;
24 }

?

  三、XmlTextReader 方式

代碼 1 static List<Channel> testXmlReader()
2 {
3 var lstChannel = new List<Channel>();
4 var reader = XmlReader.Create(xmlStream);
5 while (reader.Read())
6 {
7 if (reader.Name == "item" && reader.NodeType == XmlNodeType.Element)
8 {
9 var channel = new Channel();
10 lstChannel.Add(channel);
11 while (reader.Read())
12 {
13 if (reader.Name == "item") break;
14 if (reader.NodeType != XmlNodeType.Element) continue;
15 switch (reader.Name)
16 {
17 case "title":
18 channel.Title = reader.ReadString();
19 break;
20 case "link":
21 channel.Link = reader.ReadString();
22 break;
23 case "description":
24 channel.Description = reader.ReadString();
25 break;
26 case "content":
27 channel.Content = reader.ReadString();
28 break;
29 case "pubDate":
30 channel.PubDate = reader.ReadString();
31 break;
32 case "author":
33 channel.Author = reader.ReadString();
34 break;
35 case "category":
36 channel.Category = reader.ReadString();
37 break;
38 default:
39 break;
40 }
41 }
42 }
43 }
44 return lstChannel;
45 }

?

  四、Linq to XML?方式

代碼 1 static IList testXmlLinq()
2 {
3 var xd = XDocument.Load(xmlStream);
4 var list = from node in xd.Elements("channel").Descendants("item")
5 select new
6 {
7 Title = node.Element("title").Value,
8 Link = node.Element("link").Value,
9 Description = node.Element("description").Value,
10 Content = node.Element("content").Value,
11 PubDate = node.Element("pubDate").Value,
12 Author = node.Element("author").Value,
13 Category = node.Element("category").Value
14 };
15 return list.ToList();
16 }

?

  測(cè)試結(jié)果:

XmlDocment47ms
XPathNavigator42ms
XmlTextReader23ms
Xml Linq28ms

?

  小結(jié)一下自己的認(rèn)識(shí),XmlDocument的操作基本按W3C的DOM操作方式,不過(guò)要將全部節(jié)點(diǎn)解析成對(duì)象加載到內(nèi)存中,往往造成很大浪費(fèi)。所以微軟自己的編程規(guī)范也不推薦用它。這里由于讀取了所有節(jié)點(diǎn),可能因此性能和Navigator方式相差不大。在三種隨機(jī)讀取方式中,Xml Linq性能最高,只是方法名有點(diǎn)別扭。XmlTextReader方式是所謂的SAX,只讀向前,無(wú)疑性能最高,不過(guò)實(shí)現(xiàn)上麻煩了不少,要比較精確的控制訪(fǎng)問(wèn)邏輯,也無(wú)法用匿名類(lèi)存儲(chǔ)數(shù)據(jù)。

  .Net 3.5發(fā)布Xml Linq可以很好地取代前兩種方式,通常情況下,最好用它。只有個(gè)別場(chǎng)合,如果對(duì)性能要求極高,或者讀取Xml數(shù)據(jù)量太大不能一下子下載或讀取到內(nèi)存中,那就只好痛苦委身于XmlTextReader了。

?

轉(zhuǎn)帖地址:http://www.cnblogs.com/XmNotes/archive/2010/08/12/1796162.html

轉(zhuǎn)載于:https://www.cnblogs.com/jvstudio/archive/2010/08/12/1797809.html

總結(jié)

以上是生活随笔為你收集整理的XML数据读取方式性能比较(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。