XML数据读取方式性能比较
创始人
2024-07-29 10:40:56
0次

几个月来,疑被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. }  
  23. 二、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(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. }  
    25. 三、XmlTextReader 方式

      代码 

      1. static List testXmlReader()  
      2. {   
      3. var lstChannel = new List();   
      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了。

      【编辑推荐】

      1. Android学习笔记:Layout.xml属性
      2. Ajax和Web服务数据格式:XML SOAP HTML
      3. SQL Server数据库与XML标识语言的集成
      4. XML中的层叠样式

      相关内容

      热门资讯

      PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
      网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
      各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
      粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
      什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
      如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
      全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
      如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
      30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
      Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...