XML数据读取方式性能比较

  • XML至少有四种常用人XML数据操作方式(好像java差不多),不过还没有实际比较过这些方式各有哪些特点或优劣。本文就为您做个比较,一起来看。

几个月来,疑被SOA,一直在和xml操作打交道,SQL差不多又忘光了。现在已经知道,至少有四种常用人XML数据操作方式(好像java差不多),不过还没有实际比较过这些方式各有哪些特点或优劣。正好看到网上也没有这方面的实验,偶来总结一下。

测试开始先读取XML源,用一个比较大的rss文件链接,复制到项目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(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();  

测试结果:

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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/20200170/viewspace-739841/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值