在.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 将是 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="System.Xml" %> <script language="C#" runat=server> public class XmlDisplayfile://这个类读入并处置惩罚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 }
以上就是XMLTextReader和XmlDocument读取XML文件的比较的内容,更多相干内容请关注ki4网(www.ki4.cn)!