首页 > 语言 > 关键词  > xml教程最新资讯  > 正文

XMLTextReader和XmlDocument读取XML文件的比较

2008-09-05 16:04 · 稿源:互联网

看到网上一片文章,自己式了一下,果然 XMLTextReader速度要快!

在.NET框架的System.XML名称空间中包含的XMLTextReader类不需要对系统资源要求很高,就能从XML文件中快速读取数据。使用XMLTextReader类能够从XML文件中读取数据,并且将其转换为HTML格式在浏览器中输出。

读本文之前,读者需要了解一些基本知识:XML、HTML、C#编程语言,以及.NET尤其是ASP.NET框架的一些知识。

微软公司的.NET框架为开发者提供了许多开发的便利,随着XML的重要性不断增长,开发者们都期待着有一整套功能强大的XML工具被开发出来。.NET框架没有辜负我们的这番期望,在System.XML 名称空间中组织进了以下几个用于XML的类:

XMLTextReader------提供以快速、单向、无缓冲的方式存取XML数据。(单向意味着你只能从前往后读取XML文件,而不能逆向读取)

XMLValidatingReader------与XMLTextReader类一起使用,提供验证DTD、XDR和XSD架构的能力。

XMLDocument------遵循W3C文档对象模型规范的一级和二级标准,实现XML数据随机的、有缓存的存取。一级水平包含了DOM的最基本的部分,而二级水平增加多种改进,包括增加了对名称空间和级连状图表(css)的支持。

XMLTextWriter------生成遵循 W3C XML 1.0 规范的XML文件。

本文主要讲述的是第一个类XMLTextReader,这个类设计的目的就是从XML文件中快速的读取数据,而对系统资源(主要包括内存和处理器时间)不做很高的要求。在父级程序的控制下,它通过每次只处理一个节点的方式对XML文件进行逐步操作,实现这种工作过程。在XML文件的每个节点中,父级程序能决定该节点的类型,它的属性和数据(如果有的话),以及其他有关该节点的信息。基于这些信息,父级程序可以选择是处理这个节点还是忽略该节点的信息,以满足各种应用程序请求的需要。这被称为抽取式(pull)处理模型,因为父级程序发出请求并且从XML文件中抽取各个节点,然后根据需要处理它或者是不处理它。
我们可以把XMLTextReader类和XML简单应用程序接口,即SAX相比,后者是在编程人员中非常流行的另一种读取XML数据的技术。XMLTextReader 和SAX有一点很相似,它们都不需要占用很多的系统资源,就能迅速的从XML文件读取数据。但是,与XMLTextReader的抽取式模型迥然不同,SAX使用的是推入式模型:XML处理器通过 “事件”告知主机应用程序哪些节点数据是可以获得,那些不能获得;根据需要,主机程序则作出相应的反应或置之不理。换句话说,数据的传送方向是从SAX处理程序中推入到主机。程序员们势必会在抽取式和推入式处理模型谁更有优势的问题上争论一番,但是大家都不可否认的是,两种模型都能很好的进行工作。.NET 框架不支持SAX,但是你能使用现存的SAX工具, 例如 MSXML分析器,用于你的.NET 程序。

XMLTextReader 类有一些构造程序来适应各种各样的情况,比如从一个已经存在的数据流或统一资源定位网址读取数据。最常见的是,你或许想从一个文件读取XML数据,那么也就有一个相应的构造程序来为此服务。这里有一个例子(我的所有代码例子都使用的是C#语言,如果你喜欢使用VISUAL BASIC语言,它们转换起来很容易)。

XMLTextReader myReader;
myReader = New XMLTextReader("c:\data\sales.XML")

创建一个称为Read()方法的循环,这个方法的返回值总是为真,直到到达文件的底部时,返回值才变为假。换句话说, 循环在文件的开始时启动并且读入所有的节点, 一次读入一个节点, 直到到达文件的结尾:

While (myReader.Read()) {
...
// 在这里处理每个节点.
...
}

每次成功调用Read()之后,XMLTextReader实例化程序包含了目前节点(即刚刚从文件中读取的那个节点)的信息。我们可以从XMLTextReader的成员中获得上述信息,就像表格1中描述的一样;并通过NodeType属性判断出当前节点的类型。在节点类型的基础上,程序的代码可以读取节点数据,检查它是否有属性,到底是忽略它还是根据程序需要进行相应的操作和处理。

当使用NodeType属性时,理解节点怎么联系到XML单元是非常重要的。例如, 看下列 XML元素:

<city>Chongqing</city>

XMLtextReader 把这个元素看作 3 个节点,顺序如下:

1.<city>标签被读为类型 XMLNodeType.Element 节点,元素的名字“city”可从 XMLTextReader 的Name属性中获得。

2.文本数据“Chongqing”被读为类型为XMLNodeType.Text的节点。数据“Chongqing ” 可从XMLTextReader 的Value属性中取得。

3.</city>标签被读为类型为XMLNodeType.EndElement 节点。同样,元素的名称“city”可从XMLTextReader的Name属性中获得。

这是 3 种重要的节点类型,其它的类型在.NET的说明文档中有详细说明,请大家参阅相关资料。

如果XMLTextReader遇到一个错误, 例如出现违反XML句法的情况,它抛出一个System.XML.XMLException类型的异常。使用这个类的代码应该总是被保护 ( 在Try……Catch块中),就像你以后在演示程序中看到的一样。
本文只是一篇相当简单的介绍XMLTextReader 类的文章,XMLTextReader类有相当多的成员,在这里不可能一一述及。当读入XML数据时,XMLTextReader能提供相当强的灵活性。即便如此,我仍然进行了大量的论述,以保证读者能编制程序来实现现实世界中经常要求完成的任务,也就是从一个XML文件读取数据然后以HTML的格式输出,从而实现在浏览器中的显示。

这个ASP.NET程序(脚本)在服务器上运行并产生一个HTML页面返回浏览器。这段脚本程序在代码段 1 给出,它用来工作使用的 XML 数据文件在代码段 2给出。你能看到这个 XML 文件包含一份表示联系关系的列表;程序的目标即是将这个列表显示出来,为了更容易我们观察,这些列表已经被格式化了。

运行程序:

1. 将代码段1存为XMLTextReader.ASPx文件,将代码段2存为XMLData.XML文件。

2. 把这两个文件都放在一个已经安装好.NET 框架的网络服务器的虚拟文件夹中。

3. 打开 Internet Explorer 并且浏览这个ASPx文件,例如,在一个局域网服务器上, URL 将是 https://localhost/xmltextreader.ASPx ;。

程序工作的大部分都由XMLDisplay 类来做,尤其是被ProcessXML()方法完成的。它每次读取一个节点XML数据,对于感兴趣的元素,节点数据和后跟冒号的节点名将和相应的HTML格式化标签一起写入输出结果中。在这阶段,“输出结果”由一个HTML文本暂时储存在其中的StringBuilder对象构成。

ProcessXML()方法是从LoadDocument()方法调用的。这个方法执行的任务是产生一个XMLTextReader实例化程序并在调用ProcessXML之前装载XML文件。它同时也处理异常,随后产生错误的信息并在浏览器中显示出来。最终该方法返回一个字符串,这个字符串或者包含产生的HTML内容,或者如果异常发生的话就包含出错信息,。

程序执行以Page_Load()程序开始,当浏览器请求浏览这个页面时,这一步会自动执行。这里的代码实例化了XMLDisplay 类并调用它的LoadDocument()方法。如果一切运行正常的话,格式化的HTML形式的返回值将被拷贝到页面的一个<div>标签中,生成的HTML文档被送回到浏览器中并显示出来。

其他的.NET 框架的类,比如XMLDocument类在读取XML数据方面表现如何呢?XMLDocument 类与XMLTextReader 类不同,它在存储器中创建整个XML文档的节点树。这样就可以随机的获得XML数据(与XMLTextReader 类获得数据的线性方式正好相反),并且在修改XML文件的数据和结构时,具有非常完美的灵活性。另外,XMLDocument允许执行XSLT 转变,不过,这些额外的功能是以运行速度的降低和系统资源的更多占用为代价的。
代码段1:XmlTextReader.aspx

<%@ Import Namespace="System.Xml" %>

<script language="C#" runat=server>

public class XmlDisplay
file://这个类读入并处理XML文件。
{

public string LoadDocument(String XmlFileName) {
XmlTextReader xmlReader = null;
StringBuilder html = new StringBuilder();
try {
file://创建XMLTextReader的实例。
xmlReader = new XmlTextReader(XmlFileName);
// 处理XML文件
html.Append(ProcessXml(xmlReader));
}
catch (XmlException ex){
html.Append("发生一个XML异常:" +
ex.ToString());
}
catch (Exception ex){
html.Append("发生一个普通异常:" +
ex.ToString());
}
finally
{
if (xmlReader != null)
xmlReader.Close();
}
return html.ToString();
}

private string ProcessXml(XmlTextReader xmlReader)
{
StringBuilder temp = new StringBuilder();

file://这个方法读入XML文件并生成输出的HTML文档。
while ( xmlReader.Read() )
{
// 处理一个元素节点的起始。
if (xmlReader.NodeType == XmlNodeType.Element)
{
file://忽略<people>和<person>元素
if ((xmlReader.Name != "person") && (xmlReader.Name != "people"))
{
file://如果是一个<category>元素,开始一个新的段落
if ( xmlReader.Name == "category" )
temp.Append("<p>");
file://添加元素名到输出中
temp.Append( xmlReader.Name + ": " );
}
}
// 处理文本节点
else if (xmlReader.NodeType == XmlNodeType.Text)
temp.Append(xmlReader.Value + "<br>");
file://处理元素节点的结尾
else if (xmlReader.NodeType == XmlNodeType.EndElement)
{
file://如果是<email>节点,添加结束段落的标记
if ( xmlReader.Name == "email" )
temp.Append("</p>");
}
}//结束while循环

return temp.ToString();

} file://结束ProcessXML方法

} file://结束XmlDisplay类

private void Page_Load(Object sender, EventArgs e){
file://创建XmlDisplay类的实例
XmlDisplay XmlDisplayDemo = new XmlDisplay();
output.InnerHtml = XmlDisplayDemo.LoadDocument(Server.MapPath("XMLData.xml"));
}
</script>
<html>
<head>
</head>
<body>
<h2>演示XmlTextReader类</h2>
<div id="output" runat="server"/>
</body>
</html>

1 static void Main(string[] args)
2 {
3 DateTime d1 =DateTime.Now;
4 XmlDocumentTest();
5 DateTime d2 =DateTime.Now;
6 TimeSpan ts =d2-d1 ;
7
8 Console.WriteLine(ts.TotalMilliseconds) ;
9 Console.Read() ;
10
11 }
12
13
14 public static string XmlFileName = "../../XML/1.xml";
15
16 private static void XmlTextReaderTest()
17 {
18 XmlTextReader reader = new XmlTextReader(XmlFileName);
19 while (reader.Read() )
20 {
21 bool exit =false;
22 switch(reader.NodeType)
23 {
24 case XmlNodeType.Element :
25 break;
26 case XmlNodeType.Text :
27 if (reader.Value=="last")
28 {
29 exit=true;
30 }
31 break;
32 case XmlNodeType.EndElement :
33 break;
34 default:
35 break;
36 }
37 if(exit)
38 {
39 return;
40
41 }
42
43 }
44 }
45
46 private static void XmlDocumentTest()
47 {
48 XmlDocument xd =new XmlDocument() ;
49 xd.Load(XmlFileName) ;
50 XmlNode node = xd.SelectSingleNode("/people/person[category='last']");
51 Console.Write(node.Name) ;
52 }

结果发现第一个耗时:
结果发现第二个耗时:

https://www.cnblogs.com/goody9807/archive/2006/10/24/534888.html

举报

  • 相关推荐
  • TECNO发布全球最薄三折概念机PHANTOM Ultimate G Fold

    TECNO发布PHANTOM Ultimate G Fold概念机,采用创新双屏内折设计,配备9.94英寸柔性大屏,折叠状态下厚度仅11.49mm,展开后最薄处3.49mm,刷新三折手机轻薄纪录。其核心创新在于独特的G型三折结构,通过左右双内折实现屏幕完全内藏保护,并配备外屏保证折叠状态下的常规使用体验。该机采用精密双铰链系统,支持多角度悬停,搭配2000MPa高强度钢铰链和0.3mm超薄钛纤维背板,兼顾强度与轻薄。量产版将搭载高性能芯片、多焦段三摄系统和超5000mAh电池,重新定义旗舰折叠屏体验。

  • 超凡性能,卓越设计——三星Galaxy Watch Ultra的诞生之路

    三星Galaxy Watch Ultra智能手表全新升级,融合"天圆地方"设计美学与户外性能。采用圆形表盘与方形底座结合,配备专属快捷按键,支持一键切换运动模式。表带采用无表耳设计,提升佩戴舒适度,并提供水上运动、越野运动等专业表带选择。搭载超级模拟表盘,可显示9项运动数据,支持个性化设置。2025款新增"钛岭蓝"配色,7月25日正式发售,预约可享表带赠品或分期免息优惠。这款兼具设计美感与实用功能的智能手表,重新定义了户外运动装备标准。

  • 如何通过Matrixport结构化理财产品把握加密市场机遇,稳中求胜?

    文章探讨了在通胀上升、就业下降的宏观环境下,投资者面临的挑战和不确定性。重点介绍了Matrixport提供的加密理财产品,如"趋势智赢"和"鲨鱼鳍"等结构化产品,帮助投资者在不同市场环境下实现稳定收益。特别推出创新产品"海鸥",适合单边行情投资,门槛低、灵活性高,能在极端行情中获取高额收益。Matrixport通过多样化产品矩阵满足不同投资者需求,帮助用户在市场波动中灵活调整策略,实现资金增值。未来将继续深耕加密资管领域,为全球用户提供优质理财服务。

  • 韩寒新片《飞驰人生3》备案通过 网友喊话小米赞助:用SU7 Ultra

    根据国家电影局最新备案、立项公示,电影《飞驰人生3》已于4月立项,编剧为韩寒,备案单位上海亭东影业有限公司。 将于2025年8月初在上海开机,拍摄周期约2-3个月。 剧情梗概:最后一届巴音布鲁克拉力赛落下帷幕,如愿以偿的张驰回归现实。团队面对旧成员的离开,新技术的挑战,他必须思考该如何开启新的征程。 有网友认为,新技术的挑战应该指的是新能源或者智�

  • 小米和SU7 Ultra车主共赴纽北:车主特别兴奋 被小米彻底打动了

    近日小米特邀小米Ultra Club部分车主共赴纽北,小米首席测试车手任周灿在纽北赛道上驾驶SU7 Ultra,带车主们试乘,他们还还探访了保时捷、奔驰、宝马博物馆,近距离感受百年汽车文化。 一位参与纽北一行的车主表示,整个纽北之旅都特兴奋、特激动,真是梦想照进现实”了,从小米安排的行程细节就能感觉到满满的诚意,那种谦卑、想和用户做朋友的心还有对造车的认真�

  • 问界新M5 Ultra直击消费者痛点,价格权益诚意十足

    文章分析了消费者购车时面临的多重考量因素,重点介绍了问界新M5 Ultra的竞争优势。该车型以27.98万元起的亲民价格,提供最高33000元的五重购车权益,包括价值20000元的ADS高阶功能包补贴和6000元选配权益等。其智能驾驶辅助系统能实现精准跟车、智能泊车等功能,大幅提升驾驶安全性和便利性。相比同级车型,问界新M5 Ultra在价格权益、智能配置和交付效率方面优势明显,用户口碑良好,成功解决了传统购车等待周期长的痛点,树立了"速度与品质并重"的行业标杆。

  • 让从容成为常态!问界新M5 Ultra超值礼遇来袭,重构出行逻辑

    文章介绍问界新M5 Ultra如何解决都市出行痛点。该车型搭载华为ADS智能驾驶系统,配备192线激光雷达、4D毫米波雷达等先进传感器,构建全方位感知网络,能精准应对复杂路况。智能辅助驾驶系统可自动跟车、启停,缓解驾驶疲劳;多种智能泊车功能让停车更轻松。安全方面配备360度防护系统,紧急转向辅助功能覆盖50-135km/h车速区间。同时优化"舒适制动"功能,减少顿挫感。购车可享最高33000元优惠,包括价值20000元的ADS高阶功能包补贴。问界新M5 Ultra以智能驾驶、多重安全保障和超值礼遇,为消费者提供更安全便捷的出行解决方案。

  • 颜值拉满!“千元顶流”大眼橙C2 Ultra投影仪推出全新荔枝白配色

    大眼橙推出夏日限定款C2 Ultra清爽版投影仪,采用荔枝白配色,外观清新时尚。配置方面拥有950CVIA流明亮度、1080P分辨率,搭载Amlogic T982芯片和4+32G内存,支持MEMC运动补偿。内置10W音响和600CC大音腔,音质出色。配备全金属云台支架,支持360°调节。首销价1799元,性价比突出,目前已在线上开启预约。作为千元投影旗舰,该产品在外观、画质和性能方面均有出色表现,是暑期观影娱乐的理想选择。

  • Perplexity推出AI浏览器Comet:想用得开1400元/月的订阅

    由英伟达支持的Perplexity AI推出了一款名为Comet的AI驱动网络浏览器。 Comet浏览器的核心卖点是其AI驱动的交互体验,公司表示它将整个浏览会话转变为单一、无缝的交互,将复杂的工作流程简化为流畅的对话。

  • 2299元起!三星Galaxy Watch 8/Classic/Ultra智能手表发布

    三星今晚除了三款折叠屏手机之外,还推出了三款Galaxy Watch 8系列智能手表。 具体型号分别是Galaxy Watch 8、Galaxy Watch 8 Classic、Galaxy Watch 8 Ultra,起售价2299元。 三款产品统一采用了天圆地方”的设计语言,表壳为圆角矩形,表盘则是传统圆形。 三星Galaxy Watch 8 提供慕岩灰、星辉银两种配色,有44mm和40mm两种尺寸。 内部结构重新设计,组件集成度提升30%,整体厚度较上代减少1