`
pcajax
  • 浏览: 2168019 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

XML数据读取方式性能比较(一)

阅读更多

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

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

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Stream xmlStream = new MemoryStream(File.ReadAllBytes(path));

    

  一、XmlDocument 方式

代码
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 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 方式

代码
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 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 方式

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

 

  四、Linq to XML 方式

代码
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 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();
16 }

 

  测试结果:

XmlDocment 47ms
XPathNavigator 42ms
XmlTextReader 23ms
Xml Linq 28ms

 

  小结一下自己的认识,XmlDocument的操作基本按W3C的DOM操作方式,不过要将全部节点解析成对象加载到内存中,往往造成很大浪费。所以微软自己的编程规范也不推荐用它。这里由于读取了所有节点,可能因此性能和Navigator方式相差不大。在三种随机读取方式中,Xml Linq性能最高,只是方法名有点别扭。XmlTextReader方式是所谓的SAX,只读向前,无疑性能最高,不过实现上麻烦了不少,要比较精确的控制访问逻辑,也无法用匿名类存储数据。

  .Net 3.5发布Xml Linq可以很好地取代前两种方式,通常情况下,最好用它。只有个别场合,如果对性能要求极高,或者读取Xml数据量太大不能一下子下载或读取到内存中,那就只好痛苦委身于XmlTextReader了。

分享到:
评论

相关推荐

    MySql读写Xml两种方式性能比较

    本篇文章将详细探讨MySQL中利用存储过程读取和写入XML数据的两种方法,主要关注使用`ExtractValue`函数的性能表现。 1. **XML在MySQL中的基础** XML(Extensible Markup Language)是一种用于描述数据的语言,广泛...

    tinyxml2解析XML文件读取数据

    4. **读取XML数据** - 对于元素,可以使用`XMLElement::Value()`获取元素的文本内容。 - 对于属性,可以使用`XMLAttribute::Value()`获取属性值。 - 对于文本节点,使用`XMLText::Value()`获取文本内容。 5. **...

    Unity实现读取XML和数据写入到XML

    4. **数据读取**:在Unity中,我们可以使用`File.ReadAllText`或`TextAsset`来读取XML文件内容。然后,通过序列化工具将XML文本转换为对象,便于在游戏逻辑中使用。 5. **数据写入**:当需要修改或添加XML数据时,...

    MFC保存控件数据到xml及读取xml数据到控件

    2. **读取XML数据到控件**: - 当应用程序启动时,或者需要恢复控件状态时,读取XML文件。使用TinyXML2的XMLDocument::LoadFile()方法加载XML文件。 - 遍历XML文档中的元素,根据元素的ID找到对应的MFC控件。然后...

    pb下读写xml文件的例子.rar_pb_pb 读取xml_pb 读取xml文件_pb9 xml_pb下读写xml文件的例子

    此外,为了提高性能,可以使用内存流缓冲XML数据,尤其是处理大型XML文件时。 总结,PowerBuilder 9为处理XML文件提供了强大的支持,通过XMLDocument对象和DOM解析器,我们可以轻松地读取、写入和操作XML数据。这些...

    java读取XMl数据

    Java中读取XML数据主要有以下几种方式: 1. DOM(Document Object Model)解析: DOM解析器将整个XML文档加载到内存中,形成一棵DOM树。我们可以使用`DocumentBuilder`类来构建这棵树,然后通过遍历节点来访问XML...

    如何以XML 方式读写数据表信息,C++.net源代码编写,VisualStudio.net

    学习这些技术可以帮助更灵活地操作XML数据。 10. **Visual Studio .NET集成** Visual Studio .NET提供了一个强大的集成开发环境(IDE),支持XML编辑、验证和调试。其内置的XML工具窗口和IntelliSense功能有助于...

    MATLAB读取XML格式的数据文件

    MATLAB提供了读取和写入XML文件的功能,使得用户能够方便地在MATLAB环境中处理XML数据。 在MATLAB中,可以使用`xmlread`函数来读取XML文件。这个函数将XML文件解析成一个XML文档对象模型(DOM),然后可以通过DOM ...

    xml数据岛例子

    总结一下,"XML数据岛"是.NET框架中一种利用HTML和XML结合的技术,它使开发者能够直接在客户端处理XML数据,提高了Web应用的交互性和性能。通过学习和实践这个例子,我们可以深入理解XML在Web开发中的作用,以及如何...

    silverlight读取本地xml数据

    它允许开发者构建交互性强、图形丰富的Web应用,而读取XML数据是Silverlight应用程序中常见的任务之一。XML(eXtensible Markup Language)是一种结构化数据格式,广泛用于存储和交换数据。 在Silverlight中读取...

    以读取XML方式的大批量导入Excel

    这篇博客“以读取XML方式的大批量导入Excel”介绍了一种高效处理Excel数据的方法,特别是当数据量非常大时,传统的API可能无法满足性能需求。XML作为一种结构化的数据格式,能够很好地存储和传输大量数据,因此,...

    sax解析xml本地读取xml

    SAX(Simple API for XML)是XML解析器的一种,它采用事件驱动的方式对XML文档进行解析,而不是一次性加载整个文档到内存中,因此在处理大型XML文件时,SAX解析器具有较高的性能和较低的内存消耗。 标题“sax解析...

    sqlite3 xml读写

    7. **性能优化**:对于大量XML数据,考虑性能优化是必要的。这可能包括合理设计数据库表结构、缓存XML解析结果、使用适当的索引等策略。 8. **错误处理**:处理XML和SQLite3时,应充分考虑到可能出现的错误,如XML...

    一种XML数据库的数据模型PDF,深层次讲解XML

    - **访问控制**:限制用户对XML数据的读写权限。 - **加密**:对敏感数据进行加密,保护信息安全。 7. **应用场景**: - **Web服务**:XML用于描述Web服务接口(如WSDL)和数据交换(如SOAP)。 - **数据集成**...

    jquery读取xml

    jQuery还提供了`$.getXML()`方法,它是`$.ajax()`的一个特例,用于从服务器获取XML数据。然而,这个方法在jQuery 3.0版本中已被弃用,推荐使用`$.ajax()`方法,并指定`dataType: 'xml'`。 ```javascript $.ajax({ ...

    birt xml数据源

    BIRT XML数据源是BIRT平台中的一个重要组成部分,用于处理XML格式的数据。下面将详细阐述BIRT XML数据源的相关知识点。 1. **BIRT概述**: BIRT是由Eclipse基金会维护的一个开源项目,旨在为Java和Web应用程序提供...

    C# XML文件读取示例

    在C#编程环境中,XML(eXtensible Markup Language)是一种常用的数据交换格式,它具有结构化、易于理解和解析的特点。本示例将详细介绍如何在C#中读取XML文件,帮助开发者理解并掌握相关技术。 首先,让我们了解...

    用java编写的从数据库和XML中读写数据的应用程序

    而StAX则允许程序员以流式方式处理XML,提供了读写XML的灵活性和效率。 为了从数据库读取数据,Java程序员通常会编写SQL查询,然后使用PreparedStatement或Statement对象来执行这些查询。结果集可以通过ResultSet...

    C#读取XML文件并写入数据库

    - `XDocument` 和 `XmlDocument` 都提供了一种将整个XML文档加载到内存中的方式,然后可以方便地通过LINQ查询语法操作XML数据。适合较小的XML文件。 - `XDocument` 更为推荐,因为它提供了更简洁的API,而 `Xml...

    c++ xml数据的读写.zip

    在本软件中,我们主要探讨如何使用C++进行XML数据的读写操作。首先,我们需要了解XML的基本结构,包括元素(Element)、属性(Attribute)、文本内容(Text Content)、注释(Comment)以及处理指令(Processing ...

Global site tag (gtag.js) - Google Analytics