我选择了我认为最方便而高效的方式,用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文档必须遵循的规则,如何创建和使用XML标记,提取信息并将其换为HTML或其他格式的方法,存储和读取XML文档的策略,如何使用DOM和SAM操作XML文档,使用Ajax技术、RSS和SOAP提升XML通信性能的技巧,如何使用...
创建XML文档必须遵循的规则,如何创建和使用XML标记,提取信息并将其换为HTML或其他格式的方法,存储和读取XML文档的策略,如何使用DOM和SAM操作XML文档,使用Ajax技术、RSS和SOAP提升XML通信性能的技巧,如何使用...
创建XML文档必须遵循的规则,如何创建和使用XML标记,提取信息并将其换为HTML或其他格式的方法,存储和读取XML文档的策略,如何使用DOM和SAM操作XML文档,使用Ajax技术、RSS和SOAP提升XML通信性能的技巧,如何使用...
创建XML文档必须遵循的规则,如何创建和使用XML标记,提取信息并将其换为HTML或其他格式的方法,存储和读取XML文档的策略,如何使用DOM和SAM操作XML文档,使用Ajax技术、RSS和SOAP提升XML通信性能的技巧,如何使用...
动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和...
采用WHAX数据模型及其查询语言WHAX-QL作为XML数据模型及查询语言,分析了WHAX-QL的重构能力,讨论了自维护问题的定义,设定视图的外延是可读取的,采用最小Z划分对绑定模式进行划分,将绑定模式变量分为显式变量和...
列举ASP.NET 页面之间传递值的几种方式。 答. 1.使用QueryString, 如....?id=1; response. Redirect().... 2.使用Session变量 3.使用Server.Transfer 3. 一列数的规则如下: 1、1、2、3、5、8、13、21、34...... ...
143.如何创建和显示一个XML文档(示例三) 144.如何在ASP环境下应用XML 145.如何通过XMLDom在服务器端操作XML文件(示例一) 145.如何通过XMLDom在服务器端操作XML文件(示例二) 146.如何使用XML实现不刷新页面查询...
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 的渲染函数从 React 组件中创建一个节点树。然后它响应数据模型中的变化来更新该树,该变化是由用户或系统完成的各种动作引起的。 Virtual DOM ...
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 ...
数据格式:数据集采用常见的图像格式(如JPEG、PNG等),并附带相应的标签文件(如CSV、XML等),方便用户读取和处理数据。 使用场景:该数据集适用于人脸识别、人脸验证、人脸检测等任务的研究和应用。 适用人群...
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 结果:如何将...
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 使用...