`

读取XML的三种方式,及其性能分析和比较(转)

    博客分类:
  • xml
 
阅读更多

我选择了我认为最方便而高效的方式,用DOM的方式解析,就像这样:

XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(...);
string ns = "http://schemas.xmlsoap.org/soap/envelope/";
XmlNode envelope = xmldoc["Envelope",ns];
XmlNode body = envelope["Body",ns];
XmlNode req = body["SyncOrderRelationReq"];
XmlNode linkId = req["LinkID"];
Console.WriteLine(linkId.InnerXml);

有朋友认为用XPath更好。这个我也知道,在XML的整个体系中,XPath是目前查询XML的专用语言,在这种情况下,自然最“标准”。

不过我认为由于XPath多了一个解析XPath表达式的过程,会比较慢,所以用DOM的方式更好。于是写了个性能测试代码,包含DOM, XPath, XmlReader三者的对比,以作证明:

class MainClass
{
 static XmlDocument XmlDoc;
 static XmlNamespaceManager NM;
 static string NS = "http://schemas.xmlsoap.org/soap/envelope/";
 static MemoryStream XmlStream;
 [STAThread]
 static void Main(string[] args)
 {
  XmlStream = new MemoryStream();
  FileStream fs = new FileStream("C:/test.xml",FileMode.Open);
  byte[] bytes = new byte[fs.Length];
  fs.Read(bytes,0,bytes.Length);
  XmlStream.Write(bytes,0,bytes.Length);
  fs.Close();
  XmlDoc = new XmlDocument();
  XmlDoc.Load("C:/test.xml");
  NM = new XmlNamespaceManager(XmlDoc.NameTable);
  NM.AddNamespace("SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/");
  NM.AddNamespace("Req", "http://www.monternet.com/dsmp/schemas/");
  DateTime dt1,dt2;
  string linkId;
  dt1 = DateTime.Now;
  for(int i = 0;i < 100000;i++)
  {
   linkId = XPathTest();
  }
  dt2 = DateTime.Now;
  Console.WriteLine("XPathTest: {0}",dt2 - dt1);
  dt1 = DateTime.Now;
  for(int i = 0;i < 100000;i++)
  {
   linkId = DOMTest();
  }
  dt2 = DateTime.Now;
  Console.WriteLine("DOMTest: {0}",dt2 - dt1);
  dt1 = DateTime.Now;
  for(int i = 0;i < 100000;i++)
  {
   linkId = XmlReaderTest();
  }
  dt2 = DateTime.Now;
  Console.WriteLine("XmlReaderTest: {0}",dt2 - dt1);
  XmlStream.Close();
  Console.ReadLine();
 }
 static string XPathTest()
 {
  XmlNode linkId = XmlDoc.SelectSingleNode("/SOAP-ENV:Envelope/SOAP-ENV:Body/Req:SyncOrderRelationReq/Req:LinkID", NM);
  return linkId.InnerXml;
 }
 static string DOMTest()
 {
  XmlNode linkId = XmlDoc["Envelope",NS]["Body",NS]["SyncOrderRelationReq"]["LinkID"];
  return linkId.InnerXml;
 }
 static string XmlReaderTest()
 {
  XmlStream.Position = 0;
  XmlTextReader reader = new XmlTextReader(new StreamReader(XmlStream));
  while(reader.Read() && reader.Name != "SOAP-ENV:Envelope");
  while(reader.Read() && reader.Name != "SOAP-ENV:Body");
  while(reader.Read() && reader.Name != "SyncOrderRelationReq");
  while(reader.Read() && reader.Name != "LinkID");
  return reader.ReadString();
 }
}
 

这个XML文件还包含了名称空间,在比较“正规”的情况下,确实是这种情况。
测试结果是(K8 2800+ 64bit, 512M DDR400):

XPathTest: 00:00:02.8281250
DOMTest: 00:00:00.3750000
XmlReaderTest: 00:00:13.5156250

和我的预期相符,XPath远远慢于DOM的方式,几乎差了一个数量级。

有意思的是,用XmlReader的方式按理说最快,结果这里变成了最慢。实际上,对于最后一个测试,这里有点不公平,因为XmlDocument.Load的时候已经对XML进行了遍历,然后就建立了缓存。而XmlReader每次都需要这种Load的过程,并且没有缓存。如果把加载XML的时间考虑在内,XmlReader才是最快的。另外一个方面,由于它是一种只进只读的方式,使用XmlReader可以节省内存;而对于特别大的XML文件,比如达到数百M,XmlReader就成了唯一可行的方案。

-----

update on 4/14/2005:
今天我感觉到把DOM方式和XPath方式区分开,这个名字不太好,因为用XPath查询时,本质上也是用DOM的。所以上面第二个测试,DOMTest,应该称之为手动在DOM导航的测试,而XPathTest,相当于提供一个命令,像SQL语句那样动态编译后,自动在DOM导航。

update on 4/19/2005:
处理XML里面的名称空间确实是个很麻烦的问题,在上面的例子里面,使用了XmlNamespaceManager类来处理。而在XSL/T里面,又有个小技巧(还是基于那个XML):

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
 xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
 xmlns:REQ="http://www.monternet.com/dsmp/schemas/">
 <xsl:output method="xml" />
 <xsl:template match="/">
  <xsl:value-of select="SOAP-ENV:Envelope/SOAP-ENV:Body/REQ:SyncOrderRelationReq/REQ:LinkID" />
 </xsl:template>
</xsl:stylesheet>

注意REQ这个名称空间的简写是我自己定义的,原来的XML文件没有

 

原文地址:http://blog.csdn.net/maomaochong713/article/details/419146

 

分享到:
评论

相关推荐

    XML入门经典(第4版).part1.rar

    创建XML文档必须遵循的规则,如何创建和使用XML标记,提取信息并将其换为HTML或其他格式的方法,存储和读取XML文档的策略,如何使用DOM和SAM操作XML文档,使用Ajax技术、RSS和SOAP提升XML通信性能的技巧,如何使用...

    XML入门经典(第4版).part3.rar

    创建XML文档必须遵循的规则,如何创建和使用XML标记,提取信息并将其换为HTML或其他格式的方法,存储和读取XML文档的策略,如何使用DOM和SAM操作XML文档,使用Ajax技术、RSS和SOAP提升XML通信性能的技巧,如何使用...

    XML入门经典(第4版).part2.rar

    创建XML文档必须遵循的规则,如何创建和使用XML标记,提取信息并将其换为HTML或其他格式的方法,存储和读取XML文档的策略,如何使用DOM和SAM操作XML文档,使用Ajax技术、RSS和SOAP提升XML通信性能的技巧,如何使用...

    XML入门经典(第4版).part4.rar

    创建XML文档必须遵循的规则,如何创建和使用XML标记,提取信息并将其换为HTML或其他格式的方法,存储和读取XML文档的策略,如何使用DOM和SAM操作XML文档,使用Ajax技术、RSS和SOAP提升XML通信性能的技巧,如何使用...

    asp.net知识库

    动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和...

    XML数据实体化视图自维护判定准则 (2005年)

    采用WHAX数据模型及其查询语言WHAX-QL作为XML数据模型及查询语言,分析了WHAX-QL的重构能力,讨论了自维护问题的定义,设定视图的外延是可读取的,采用最小Z划分对绑定模式进行划分,将绑定模式变量分为显式变量和...

    net学习笔记及其他代码应用

    列举ASP.NET 页面之间传递值的几种方式。 答. 1.使用QueryString, 如....?id=1; response. Redirect().... 2.使用Session变量 3.使用Server.Transfer 3. 一列数的规则如下: 1、1、2、3、5、8、13、21、34...... ...

    ASP200问.EXE

    143.如何创建和显示一个XML文档(示例三) 144.如何在ASP环境下应用XML 145.如何通过XMLDom在服务器端操作XML文件(示例一) 145.如何通过XMLDom在服务器端操作XML文件(示例二) 146.如何使用XML实现不刷新页面查询...

    WEB安全测试

    7.7 以交互方式冒充另一种设备 149 7.8 使用cURL模仿搜索引擎 151 7.9 通过假造Referer头信息来伪造工作流程 152 7.10 仅获取HTTP头 153 7.11 使用cURL发送POST请求 154 7.12 保持会话状态 156 7.13 操纵Cookie 157 ...

    React 60 道面试题及答案.docx

    它是一个节点树,将元素、它们的属性和内容作为对象及其属性。React 的渲染函数从 React 组件中创建一个节点树。然后它响应数据模型中的变化来更新该树,该变化是由用户或系统完成的各种动作引起的。 Virtual DOM ...

    [完整][中文][WEB安全测试].(美)霍普.扫描版.pdf

    7.7 以交互方式冒充另一种设备 149 7.8 使用cURL模仿搜索引擎 151 7.9 通过假造Referer头信息来伪造工作流程 152 7.10 仅获取HTTP头 153 7.11 使用cURL发送POST请求 154 7.12 保持会话状态 156 7.13 操纵Cookie 157 ...

    关于yolov7/8的人脸识别(目标检测)的数据集

    数据格式:数据集采用常见的图像格式(如JPEG、PNG等),并附带相应的标签文件(如CSV、XML等),方便用户读取和处理数据。 使用场景:该数据集适用于人脸识别、人脸验证、人脸检测等任务的研究和应用。 适用人群...

    【卷一/共两卷】AJAX实战pdf高清版90M

    8.2.2 使用Venkman性能分析器 8.2.3 优化Ajax应用的执行速度 8.3 JavaScript的内存使用量 8.3.1 避免内存泄漏 8.3.2 Ajax的特殊考虑因素 8.4考虑性能的设计 8.4.1 测量内存使用量 8.4.2 简单示例 8.4.3 结果:如何将...

    ASP.NET4高级程序设计第4版 带目录PDF 分卷压缩包 part1

    14.3.2 读取XML文件 14.4 内存中的XML处理 14.4.1 XmlDocument 14.4.2 XPathNavigator 14.4.3 XDocument 14.5 搜索XML内容 14.5.1 搜索XmlDocument 14.5.2 使用XPath搜索XmlDocument 14.5.3 使用...

Global site tag (gtag.js) - Google Analytics