【转】解析.Net框架下的XML编程技术
【引自突破思維的禁忌的博客】一、前言
XML是微軟.Net戰(zhàn)略的一個(gè)重要組成部分,而且它可謂是XML Web服務(wù)的基石,所以掌握.Net框架下的XML技術(shù)自然顯得非常重要了。本文將指導(dǎo)大家如何運(yùn)用C#語(yǔ)言完成.Net框架下的XML文檔的讀寫(xiě)操作。首先,我會(huì)向大家介紹.Net框架中與XML相關(guān)的命名空間和其中的重要類(lèi)。其次,我還會(huì)給出有關(guān)的實(shí)例以使讀者更進(jìn)一步的了解XML文檔的讀寫(xiě)操作的具體方法。
二、XML命名空間和相關(guān)類(lèi)簡(jiǎn)介
在深入進(jìn)行.Net框架下的XML文檔的操作之前,我想很有必要向大家介紹.Net框架中與XML技術(shù)有關(guān)的命名空間和其中一些重要的類(lèi)。.Net框架為我們提供了以下一些命名空間:System.Xml、System.Xml.Schema、System.Xml.Serialization、System.Xml.Xpath以及 System.Xml.Xsl來(lái)包容和XML操作相關(guān)的類(lèi)。
◆System.Xml命名空間包含了一些最重要的XML類(lèi),其中最主要的類(lèi)是和XML文檔的讀寫(xiě)操作相關(guān)的類(lèi)。這些類(lèi)中包括4個(gè)與讀相關(guān)的類(lèi)以及2個(gè)與寫(xiě)相關(guān)的類(lèi)。它們分別是:XmlReader、XmlTextReader、XmlValidatingReader、XmlNodeReader、XmlWriter以及 XmlTextWriter。本文將重點(diǎn)介紹這些類(lèi),因?yàn)樗鼈兪亲罨疽彩亲钪匾念?lèi)。
◆XmlReader類(lèi)是一個(gè)虛基類(lèi),它包含了讀XML文檔的方法和屬性。該類(lèi)中的Read方法是一個(gè)基本的讀XML文檔的方法,它以流形式讀取XML文檔中的節(jié)點(diǎn)(Node)。另外,該類(lèi)還提供了ReadString、ReadInnerXml、ReadOuterXml和ReadStartElement等更高級(jí)的讀方法。除了提供讀XML文檔的方法外,XmlReader類(lèi)還為程序員提供了MoveToAttribute、MoveToFirstAttribute、MoveToContent、MoveToFirstContent、MoveToElement以及 MoveToNextAttribute等具有導(dǎo)航功能的方法。在本文后面介紹的實(shí)例中,我們將運(yùn)用到這些方法。
◆XmlTextReader、XmlNodeReader以及XmlValidatingReader等類(lèi)是從XmlReader類(lèi)繼承過(guò)來(lái)的子類(lèi)。根據(jù)它們的名稱(chēng),我們可以知道其作用分別是讀取文本內(nèi)容、讀取節(jié)點(diǎn)和讀取XML模式(Schemas)。
◆XmlWriter類(lèi)為程序員提供了許多寫(xiě)XML文檔的方法,它是XmlTextWriter類(lèi)的基類(lèi),我在后面的實(shí)例中會(huì)給出相關(guān)的運(yùn)用方法。
◆XmlNode類(lèi)是一個(gè)非常重要的類(lèi),它代表了XML文檔中的某個(gè)節(jié)點(diǎn)。該節(jié)點(diǎn)可以是XML文檔的根節(jié)點(diǎn),這樣它就代表整個(gè)XML文檔了。它是許多很有用的類(lèi)的基類(lèi),這些類(lèi)包括插入節(jié)點(diǎn)的類(lèi)、刪除節(jié)點(diǎn)的類(lèi)、替換節(jié)點(diǎn)的類(lèi)以及在XML文檔中完成導(dǎo)航功能的類(lèi)。同時(shí),XmlNode類(lèi)還為程序員提供了獲取雙親節(jié)點(diǎn)、子節(jié)點(diǎn)、最后一個(gè)子節(jié)點(diǎn)、節(jié)點(diǎn)名稱(chēng)以及節(jié)點(diǎn)類(lèi)型等的屬性。它的三個(gè)最主要的子類(lèi)包括:XmlDocument、XmlDataDocument以及XmlDocumentFragment。XmlDocument類(lèi)代表了一個(gè)XML文檔,它提供了載入和保存XML文檔的方法和屬性。這些方法包括了Load、LoadXml和Save等。同時(shí),它還提供了添加特性(Attributes)、說(shuō)明(Comments)、空間(Spaces)、元素(Elements)和新節(jié)點(diǎn)(New Nodes)等XML項(xiàng)的功能。XmlDocumentFragment類(lèi)代表了一部分XML文檔,它能被用來(lái)添加到其他的XML文檔中。XmlDataDocument類(lèi)可以讓程序員更好地完成和ADO.NET中的數(shù)據(jù)集對(duì)象之間的互操作。
除了上面介紹的System.Xml命名空間中的類(lèi)外,該命名空間還包括了XmlConvert、XmlLinkedNode以及XmlNodeList等類(lèi),不過(guò)這些類(lèi)不是本文介紹的重點(diǎn),有興趣的讀者不妨去參考相關(guān)文檔資料。
System.Xml.Schema命名空間中包含了和XML模式相關(guān)的類(lèi),這些類(lèi)包括XmlSchema、XmlSchemaAll、XmlSchemaXPath以及XmlSchemaType等類(lèi)。
System.Xml.Serialization命名空間中包含了和XML文檔的序列化和反序列化操作相關(guān)的類(lèi),XML文檔的序列化操作能將XML格式的數(shù)據(jù)轉(zhuǎn)化為流格式的數(shù)據(jù)并能在網(wǎng)絡(luò)中傳輸,而反序列化則完成相反的操作,即將流格式的數(shù)據(jù)還原成XML格式的數(shù)據(jù)。
System.Xml.XPath命名空間包含了XPathDocument、XPathExression、XPathNavigator以及XPathNodeIterator等類(lèi),這些類(lèi)能完成XML文檔的導(dǎo)航功能。在XPathDocument類(lèi)的協(xié)助下,XPathNavigator類(lèi)能完成快速的XML文檔導(dǎo)航功能,該類(lèi)為程序員提供了許多Move方法以完成導(dǎo)航功能。System.Xml.Xsl命名空間中的類(lèi)完成了XSLT的轉(zhuǎn)換功能。
三、讀XML文檔的方法
在介紹完.Net框架中和XML有關(guān)的命名空間和相關(guān)類(lèi)后,我接著向大家介紹和XML相關(guān)的一些操作。首先,我向大家介紹的讀取XML文檔的方法。在下面的實(shí)例程序中,我將運(yùn)用VS.net開(kāi)發(fā)工具附帶的"books.xml"文件來(lái)作為示例。你可以在你的機(jī)器上搜索到該文件(或請(qǐng)參考附錄),或者你也可以運(yùn)用其他的XML文件。
首先,我們用XmlTextReader類(lèi)的對(duì)象來(lái)讀取該XML文檔。方法很簡(jiǎn)單,就是在創(chuàng)建新對(duì)象的構(gòu)造函數(shù)中指明XML文件的位置即可。
| XmlTextReader textReader = new XmlTextReader("C:\\books.xml"); |
一旦新對(duì)象創(chuàng)建完畢,你就可以調(diào)用其Read方法來(lái)讀取XML文檔了。調(diào)用Read方法之后,信息被存儲(chǔ)起來(lái),你可以通過(guò)讀取該對(duì)象的Name、BaseURI、Depth、LineNumber等屬性來(lái)獲取這些信息。下面我給出一個(gè)完整的實(shí)例,該實(shí)例通過(guò)簡(jiǎn)單的讀取"books.xml"文件,然后將其中的信息顯示在控制臺(tái)中。
| using System; namespace ReadXml // 讀取該元素的屬性并顯示在控制臺(tái)中 |
XmlTextReader類(lèi)中有一個(gè)很重要的屬性-NodeType,通過(guò)該屬性,我們可以知道其節(jié)點(diǎn)的節(jié)點(diǎn)類(lèi)型。而枚舉類(lèi)型XmlNodeType中包含了諸如Attribute、CDATA、Element、Comment、Document、DocumentType、Entity、ProcessInstruction以及WhiteSpace等的XML項(xiàng)的類(lèi)型。通過(guò)與XmlNodeType中的元素的比較,我們可以獲取相應(yīng)節(jié)點(diǎn)的節(jié)點(diǎn)類(lèi)型并對(duì)其完成相關(guān)的操作。下面我就給出一個(gè)實(shí)例,該實(shí)例讀取每個(gè)節(jié)點(diǎn)的NodeType,并根據(jù)其節(jié)點(diǎn)類(lèi)型顯示其中的內(nèi)容,同時(shí)程序還記錄了XML文件中每種節(jié)點(diǎn)類(lèi)型的數(shù)目。
| using System; namespace ReadXML XmlTextReader textReader = new XmlTextReader("C:\\books.xml"); while (textReader.Read()) // 節(jié)點(diǎn)類(lèi)型為XmlDeclaration // 節(jié)點(diǎn)類(lèi)型為Comment // 節(jié)點(diǎn)類(lèi)型為Attribute // 節(jié)點(diǎn)類(lèi)型為Element // 節(jié)點(diǎn)類(lèi)型為Entity // 節(jié)點(diǎn)類(lèi)型為Process Instruction // 節(jié)點(diǎn)類(lèi)型為DocumentType // 節(jié)點(diǎn)類(lèi)型為Whitespace // 在控制臺(tái)中顯示每種類(lèi)型的數(shù)目 |
以上,我向大家介紹了如何運(yùn)用XmlTextReader類(lèi)的對(duì)象來(lái)讀取XML文檔,并根據(jù)節(jié)點(diǎn)的NodeType屬性來(lái)取得其節(jié)點(diǎn)類(lèi)型信息。同時(shí)XmlReader這個(gè)基類(lèi)還有XmlNodeReader和XmlValidatingReader等派生類(lèi),它們分別是用來(lái)讀取XML文檔的節(jié)點(diǎn)和模式的。限于篇幅,這里就不介紹了,讀者可以參考有關(guān)資料。
四、寫(xiě)XML文檔的方法
XmlWriter類(lèi)包含了寫(xiě)XML文檔所需的方法和屬性,它是XmlTextWriter類(lèi)和XmlNodeWriter類(lèi)的基類(lèi)。該類(lèi)包含了WriteNode、WriteString、WriteAttributes、WriteStartElement以及WriteEndElement等一系列寫(xiě)XML文檔的方法,其中有些方法是成對(duì)出現(xiàn)的。比如你要寫(xiě)入一個(gè)元素,你首先得調(diào)用WriteStartElement方法,接著寫(xiě)入實(shí)際內(nèi)容,最后是調(diào)用WriteEndElement方法以表示結(jié)束。該類(lèi)還包含了WriteState、XmlLang和XmlSpace等屬性,其中WriteState屬性表明了寫(xiě)的狀態(tài)。因?yàn)閄mlWriter類(lèi)包含了很多寫(xiě)XML文檔的方法,所以這里只是介紹最主要的幾種。下面我們通過(guò)其子類(lèi)XmlTextWriter類(lèi)來(lái)說(shuō)明如何寫(xiě)XML文檔。
首先,我們要?jiǎng)?chuàng)建一個(gè)XmlTextWriter類(lèi)的實(shí)例對(duì)象。該類(lèi)的構(gòu)造函數(shù)XmlTextWriter有三種重載形式,其參數(shù)分別為一個(gè)字符串、一個(gè)流對(duì)象和一個(gè)TextWriter對(duì)象。這里我們運(yùn)用字符串的參數(shù)形式,該字符串就指明了所要?jiǎng)?chuàng)建的XML文件的位置,方法如下:
| XmlTextWriter textWriter = New XmlTextWriter("C:\\myXmFile.xml", null); |
在創(chuàng)建完對(duì)象后,我們調(diào)用WriterStartDocument方法開(kāi)始寫(xiě)XML文檔,在完成寫(xiě)工作后,就調(diào)用WriteEndDocument結(jié)束寫(xiě)過(guò)程并調(diào)用Close方法將它關(guān)閉。在寫(xiě)的過(guò)程中,我們可以調(diào)用WriteComment方法來(lái)添加說(shuō)明,通過(guò)調(diào)用WriteString方法來(lái)添加一個(gè)字符串,通過(guò)調(diào)用WriteStartElement和WriteEndElement方法對(duì)來(lái)添加一個(gè)元素,通過(guò)調(diào)用WriteStartAttribute和WriteEndAttribute方法對(duì)來(lái)添加一個(gè)屬性。我們還可以通過(guò)調(diào)用WriteNode方法來(lái)添加整一個(gè)節(jié)點(diǎn),其它的寫(xiě)的方法還包括WriteProcessingInstruction和WriteDocType等等。下面的實(shí)例就是介紹如何具體運(yùn)用這些方法來(lái)完成XML文檔的寫(xiě)工作的。
| using System; namespace WriteXML // 開(kāi)始寫(xiě)過(guò)程,調(diào)用WriteStartDocument方法 // 寫(xiě)入說(shuō)明 // 寫(xiě)入一個(gè)元素 // 再寫(xiě)入一個(gè)元素 // 寫(xiě)入字符 // 寫(xiě)文檔結(jié)束,調(diào)用WriteEndDocument方法 // 關(guān)閉textWriter |
五、運(yùn)用XmlDocument類(lèi)
XmlDocument類(lèi)的對(duì)象代表了一個(gè)XML文檔,它也是一個(gè)非常重要的XML類(lèi)。該類(lèi)包含了Load、LoadXml以及Save等重要的方法。其中Load方法可以從一個(gè)字符串指定的XML文件或是一個(gè)流對(duì)象、一個(gè)TextReader對(duì)象、一個(gè)XmlReader對(duì)象導(dǎo)入XML數(shù)據(jù)。LoadXml方法則完成從一個(gè)特定的XML文件導(dǎo)入XML數(shù)據(jù)的功能。它的Save方法則將XML數(shù)據(jù)保存到一個(gè)XML文件中或是一個(gè)流對(duì)象、一個(gè)TextWriter對(duì)象、一個(gè)XmlWriter對(duì)象中。
下面的程序中我們用到了XmlDocument類(lèi)對(duì)象的LoadXml方法,它從一個(gè)XML文檔段中讀取XML數(shù)據(jù)并調(diào)用其Save方法將數(shù)據(jù)保存在一個(gè)文件中。
| // 創(chuàng)建一個(gè)XmlDocument類(lèi)的對(duì)象 // 保存到文件中 |
這里,我們還可以通過(guò)改變Save方法中參數(shù),將XML數(shù)據(jù)顯示在控制臺(tái)中,方法如下:
| doc.Save(Console.Out); |
而在下面的程序中,我們用到了一個(gè)XmlTextReader對(duì)象,通過(guò)它我們讀取"books.xml"文件中的XML數(shù)據(jù)。然后創(chuàng)建一個(gè)XmlDocument對(duì)象并載入XmlTextReader對(duì)象,這樣X(jué)ML數(shù)據(jù)就被讀到XmlDocument對(duì)象中了。最后,通過(guò)該對(duì)象的Save方法將XML數(shù)據(jù)顯示在控制臺(tái)中。
| XmlDocument doc = new XmlDocument(); // 載入XmlTextReader類(lèi)的對(duì)象 |
六、總結(jié)
XML技術(shù)作為.Net的基石,其重要性自然不言而喻。.Net框架包含了五個(gè)命名空間和大量的類(lèi)來(lái)支持與XML技術(shù)有關(guān)的操作。其中System.Xml是最重要的一個(gè)命名空間,其中的XmlReader類(lèi)和XmlWriter類(lèi)以及它們的派生類(lèi)完成了XML文檔的讀寫(xiě)操作,是最基本也是最重要的類(lèi)。XmlDocument類(lèi)代表了XML文檔,它能完成與整個(gè)XML文檔相關(guān)的各類(lèi)操作,同時(shí)和其相關(guān)的XmlDataDocument類(lèi)也是非常重要的,值得讀者的深入研究。
附錄:"books.xml"文件如下:
| <?xml version='1.0'?> <!-- This file represents a fragment of a book store inventory database --> <bookstore> <book genre="autobiography" publicationdate="1981" ISBN="1-861003-11-0"> <title>The Autobiography of Benjamin Franklin</title> <author> <first-name>Benjamin</first-name> <last-name>Franklin</last-name> </author> <price>8.99</price> </book> <book genre="novel" publicationdate="1967" ISBN="0-201-63361-2"> <title>The Confidence Man</title> <author> <first-name>Herman</first-name> <last-name>Melville</last-name> </author> <price>11.99</price> </book> <book genre="philosophy" publicationdate="1991" ISBN="1-861001-57-6"> <title>The Gorgias</title> <author> <first-name>Sidas</first-name> <last-name>Plato</last-name> </author> <price>9.99</price> </book> </bookstore> |
轉(zhuǎn)載于:https://www.cnblogs.com/Shadow-Chen/archive/2009/03/19/1416435.html
總結(jié)
以上是生活随笔為你收集整理的【转】解析.Net框架下的XML编程技术的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 从一本书看经济危机中创业者的机会
- 下一篇: FastReport.Net 使用字符串