热门:网页模板.net视频教程JQueryMVCjsonExtJs源码示例三级联动JQuery菜单
您现在的位置:.Net中文社区>> XML编程>>正文内容

XML数据读取方式性能比较

发布时间:2010年08月12日点击数: 佚名

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

  测试开始先读取XML源,用一个比较大的RSS文件链接,复制到项目bin/debug目录下。

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

一、XmlDocument 方式

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

二、XPathNavigator 方式

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

三、XmlTextReader 方式

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

四、Linq to XML 方式

  1.  static IList testXmlLinq() 
  2. var xd = XDocument.Load(xmlStream); 
  3. var list = from node in xd.Elements("channel").Descendants("item"
  4. select new 
  5. Title = node.Element("title").Value, 
  6. Link = node.Element("link").Value, 
  7. Description = node.Element("description").Value, 
  8. Content = node.Element("content").Value, 
  9. PubDate = node.Element("pubDate").Value, 
  10. Author = node.Element("author").Value, 
  11. Category = node.Element("category").Value 
  12. }; 
  13. 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了。

本站热点业务

更多模板/案例展示

热门推荐

关于我们 | 联系我们 | 团队日志 | 网站地图 | 网站合作