xmltextreader:XMLTextReader和XmlDocument读取XML文件的比较



=t18> 看到网上片文章自己式了果然 XMLTextReader速度要快!

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


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

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

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

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

  XMLDocument------遵循W3C文档对象模型规范标准级和 2级标准实现XML数据随机、有缓存Cache存取级水平包含了DOM最基本部分而 2级水平增加多种改进包括增加了对名称空间和级连状图表(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”可从XMLTextReaderName属性中获得

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

  如果XMLTextReader遇到, 例如出现违反XML句法情况它抛出.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 将是

http://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=\".Xml\" %>

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

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

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

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

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

temp.;

} file://结束ProcessXML思路方法

} file://结束XmlDisplay类

private void Page_Load(Object sender, EventArgs e){
file://创建XmlDisplay类例子
XmlDisplay XmlDisplayDemo = 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 void Main( 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 XmlFileName = \"../../XML/1.xml\";
15
16 private void XmlTextReaderTest
17 {
18 XmlTextReader reader = XmlTextReader(XmlFileName);
19 while (reader.Read )
20 {
21 bool exit =false;


22 switch(reader.NodeType)
23 {
24 XmlNodeType.Element :
25 ;
26 XmlNodeType.Text :
27 (reader.Value\"last\")
28 {
29 exit=true;
30 }
31 ;
32 XmlNodeType.EndElement :
33 ;
34 default:
35 ;
36 }
37 (exit)
38 {
39 ;
40
41 }
42
43 }
44 }
45
46 private void XmlDocumentTest
47 {
48 XmlDocument xd = XmlDocument ;
49 xd.Load(XmlFileName) ;
50 XmlNode node = xd.SelectSingleNode(\"/people/person[category=\'last\']\");
51 Console.Write(node.Name) ;
52 }


结果发现第个耗时:
结果发现第 2个耗时:

Tags:  aspxmldocument xmldocumentjs xmldocument xmltextreader

延伸阅读

最新评论

发表评论