XML資料讀取方式效能比較
- XML至少有四種常用人XML資料操作方式(好像java差不多),不過還沒有實際比較過這些方式各有哪些特點或優劣。本文就為您做個比較,一起來看。
幾個月來,疑被SOA,一直在和xml操作打交道,SQL差不多又忘光了。現在已經知道,至少有四種常用人XML資料操作方式(好像java差不多),不過還沒有實際比較過這些方式各有哪些特點或優劣。正好看到網上也沒有這方面的實驗,偶來總結一下。
測試開始先讀取XML源,用一個比較大的rss檔案連結,複製到專案bin/debug目錄下。
- Stream xmlStream = new MemoryStream(File.ReadAllBytes(path));
一、XmlDocument 方式
程式碼
- static IList testXmlDocument()
- {
- var doc = new XmlDocument();
- doc.Load(xmlStream);
- var nodeList = doc.DocumentElement.ChildNodes;
- var lstChannel = new List
- foreach (XmlNode node in nodeList)
- {
- var channel = new
- {
- Title = node.SelectSingleNode("title").InnerText,
- Link = node.SelectSingleNode("link").InnerText,
- Description = node.SelectSingleNode("description").InnerText,
- Content = node.SelectSingleNode("content").InnerText,
- PubDate = node.SelectSingleNode("pubDate").InnerText,
- Author = node.SelectSingleNode("author").InnerText,
- Category = node.SelectSingleNode("category").InnerText
- };
- lstChannel.Add(channel);
- }
- return lstChannel;
- }
二、XPathNavigator 方式
程式碼
- static IList testXmlNavigator()
- {
- var doc = new XmlDocument();
- doc.Load(xmlStream);
- var nav = doc.CreateNavigator();
- nav.MoveToRoot();
- var nodeList = nav.Select("/channel/item");
- var lstChannel = new List<Object>(nodeList.Count);
- foreach (XPathNavigator node in nodeList)
- {
- var channel = new
- {
- Title = node.SelectSingleNode("title").Value,
- Link = node.SelectSingleNode("link").Value,
- Description = node.SelectSingleNode("description").Value,
- Content = node.SelectSingleNode("content").Value,
- PubDate = node.SelectSingleNode("pubDate").Value,
- Author = node.SelectSingleNode("author").Value,
- Category = node.SelectSingleNode("category").Value
- };
- lstChannel.Add(channel);
- }
- return lstChannel;
- }
三、XmlTextReader 方式
程式碼
- static List<Channel> testXmlReader()
- {
- var lstChannel = new List<Channel>();
- var reader = XmlReader.Create(xmlStream);
- while (reader.Read())
- {
- if (reader.Name == "item" && reader.NodeType == XmlNodeType.Element)
- { var channel = new Channel();
- lstChannel.Add(channel);
- while (reader.Read())
- {
- if (reader.Name == "item") break;
- if (reader.NodeType != XmlNodeType.Element) continue;
- switch (reader.Name)
- {
- case "title":
- channel.Title = reader.ReadString();
- break;
- case "link":
- channel.Link = reader.ReadString();
- break;
- case "description":
- channel.Description = reader.ReadString();
- break;
- case "content":
- channel.Content = reader.ReadString();
- break;
- case "pubDate":
- channel.PubDate = reader.ReadString();
- break;
- case "author":
- channel.Author = reader.ReadString();
- break;
- case "category":
- channel.Category = reader.ReadString();
- break;
- default:
- break;
- }}}}
- return lstChannel;
- }
四、Linq to XML 方式
程式碼
- static IList testXmlLinq()
- {
- var xd = XDocument.Load(xmlStream);
- var list = from node in xd.Elements("channel").Descendants("item")
- select new
- {
- Title = node.Element("title").Value,
- Link = node.Element("link").Value,
- Description = node.Element("description").Value,
- Content = node.Element("content").Value,
- PubDate = node.Element("pubDate").Value,
- Author = node.Element("author").Value,
- Category = node.Element("category").Value
- };
- return list.ToList();
測試結果:
XmlDocment 47ms
XPathNavigator 42ms
XmlTextReader 23ms
Xml Linq 28ms
小結一下自己的認識,XmlDocument的操作基本按W3C的DOM操作方式,不過要將全部節點解析成物件載入到記憶體中,往往造成很大浪費。所以微軟自己的程式設計規範也不推薦用它。這裡由於讀取了所有節點,可能因此效能和Navigator方式相差不大。在三種隨機讀取方式中,Xml Linq效能最高,只是方法名有點彆扭。XmlTextReader方式是所謂的SAX,只讀向前,無疑效能最高,不過實現上麻煩了不少,要比較精確的控制訪問邏輯,也無法用匿名類儲存資料。
.Net 3.5釋出Xml Linq可以很好地取代前兩種方式,通常情況下,最好用它。只有個別場合,如果對效能要求極高,或者讀取Xml資料量太大不能一下子下載或讀取到記憶體中,那就只好痛苦委身於XmlTextReader了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/20200170/viewspace-739841/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料泵不同工作方式效能比較(六)
- 資料泵不同工作方式效能比較(五)
- 資料泵不同工作方式效能比較(四)
- 資料泵不同工作方式效能比較(三)
- 資料泵不同工作方式效能比較(二)
- 資料泵不同工作方式效能比較(一)
- XML Schema和XML DTD的資料型別比較XML資料型別
- HashMap,LinkedHashMap,TreeMap讀取大量資料效率的比較HashMap
- java中四種操作xml方式的比較JavaXML
- 百萬行資料查詢效能比較
- mongodb資料遷移2種方式比較MongoDB
- 遊標資料不同方式讀取、提交效能對比分析
- MySQL大量資料入庫的效能比較MySql
- LINQ讀取簡單的XML資料XML
- SQL Server資料庫匯入匯出資料方式比較SQLServer資料庫
- XML的四種解析器原理及效能比較(轉)XML
- redis和ssdb讀取效能對比Redis
- MySQL大量資料入庫的效能比較(分割槽)MySql
- Unity 讀取xmlUnityXML
- Oracle資料庫的備份與恢復方式比較Oracle資料庫
- 多種方式讀取 MySQL 資料庫配置MySql資料庫
- MySQL大量資料插入各種方法效能分析與比較MySql
- 用PHP連mysql和oracle資料庫效能比較(轉)PHPMySqlOracle資料庫
- JAVA IO效能比較Java
- 批量更新效能比較
- merge into三種表連線方式的效能比較(一)
- web快取伺服器效能比較nustervsnginxvsvarnishWeb快取伺服器Nginx
- 圖資料庫比較資料庫
- 資料結構比較資料結構
- 主流資料庫比較資料庫
- php讀取xml資料庫欄位超長處理PHPXML資料庫
- 四種操作xml的方式: SAX, DOM, JDOM , DOM4J的比較XML
- 探索多種資料格式:JSON、YAML、XML、CSV等資料格式詳解與比較JSONYAMLXML
- Spark Streaming讀取Kafka資料兩種方式SparkKafka
- 雲端TensorFlow讀取資料IO的高效方式
- C#讀取XMLC#XML
- C#不使用DataSet操作XML,XmlDocument讀寫xml所有節點及讀取xml節點的資料總結C#XML
- 從資料庫Mysql讀取資料轉化為xml文件的Java類資料庫MySqlXMLJava