成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

XML數(shù)據(jù)讀取方式性能比較

開發(fā)
XML至少有四種常用人XML數(shù)據(jù)操作方式(好像java差不多),不過還沒有實(shí)際比較過這些方式各有哪些特點(diǎn)或優(yōu)劣。本文就為您做個(gè)比較,一起來看。

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

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

  1. 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.  {  var channel = new Channel();  
  9. lstChannel.Add(channel);  
  10.  while (reader.Read())  
  11.  {  
  12.  if (reader.Name == "item") break;  
  13.  if (reader.NodeType != XmlNodeType.Element) continue;  
  14.  switch (reader.Name)  
  15.  {  
  16.  case "title":  
  17.  channel.Title = reader.ReadString();  
  18. break;  
  19. case "link":  
  20. channel.Link = reader.ReadString();  
  21. break;  
  22.  case "description":  
  23. channel.Description = reader.ReadString();  
  24. break;  
  25. case "content":  
  26. channel.Content = reader.ReadString();  
  27. break;  
  28.  case "pubDate":  
  29.  channel.PubDate = reader.ReadString();  
  30.  break;  
  31.  case "author":  
  32. channel.Author = reader.ReadString();  
  33.  break;  
  34. case "category":  
  35. channel.Category = reader.ReadString();  
  36.  break;  
  37. default:  
  38. break;  
  39. }}}}  
  40. return lstChannel;  
  41. }  

四、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();  

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

XmlDocment 47ms 

XPathNavigator 42ms

XmlTextReader 23ms

Xml Linq 28ms

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

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

【編輯推薦】

  1. Android學(xué)習(xí)筆記:Layout.xml屬性
  2. Ajax和Web服務(wù)數(shù)據(jù)格式:XML SOAP HTML
  3. SQL Server數(shù)據(jù)庫(kù)與XML標(biāo)識(shí)語言的集成
  4. XML中的層疊樣式
責(zé)任編輯:于鐵 來源: knowsky.com
相關(guān)推薦

2011-04-15 10:26:38

JavaMVC

2009-05-25 08:39:08

iPhone蘋果移動(dòng)OS

2013-12-16 10:20:48

MySQL數(shù)據(jù)庫(kù)

2023-11-20 10:34:09

語言

2012-12-03 10:26:51

Scala

2009-12-04 19:28:25

FreeBSD 8.0Ubuntu 9.10性能比較

2010-12-27 16:01:45

jQuery選擇器

2023-11-19 21:17:58

GoRust

2023-12-11 08:39:14

Go語言字符串拼

2009-07-01 18:12:18

JSP的優(yōu)勢(shì)性能比較

2017-12-14 10:16:01

CaddySSLDockerNginx

2011-07-06 14:18:40

Percona SerMySQL

2013-04-03 10:04:36

MySQL 5.6

2015-02-05 09:25:51

HTTPSSPDYHTTP2

2020-07-27 08:24:42

編程語言C語言Java

2024-06-24 07:00:00

C++RustGo

2010-03-10 16:35:23

Python編程語言

2009-12-16 14:10:12

路由技術(shù)性能比較

2015-03-09 10:40:44

MySQL大量數(shù)據(jù)插入

2016-12-07 10:42:57

排序算法實(shí)例
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久免费视频在线 | 在线毛片网 | 欧美精品日韩精品国产精品 | 91久久视频 | 精品1区| 日韩av网址在线观看 | 欧美一级在线视频 | 成人在线亚洲 | 免费99精品国产自在在线 | 亚洲激情一区二区三区 | 欧美日韩不卡合集视频 | 操亚洲| 成人av网站在线观看 | 精品国产一区二区三区久久 | 亚洲乱码一区二区三区在线观看 | 99精品在线 | 欧美一级在线观看 | 在线观看国产精品视频 | 欧美一区二区三区 | 国产成人精品一区二三区在线观看 | 色婷婷综合网 | 精品亚洲一区二区三区四区五区 | 在线看一区二区三区 | 国产精品一区二区三区在线 | 美女福利视频 | 国产精品久久久久久久久久久久冷 | 久久久久成人精品亚洲国产 | 国产成人综合在线 | 久久久婷| 四虎影视1304t| 国产精品久久久久久久久久免费看 | 久久国产精品久久久久久久久久 | 日本又色又爽又黄的大片 | 日韩中文字幕网 | 欧美精品一二三 | av在线免费观看网站 | 欧美国产一区二区 | 二区欧美| 久久一区二区三区电影 | 日日夜夜天天 | 可以免费观看的av片 |