国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
C#發(fā)現(xiàn)之旅第一講 C#-XML開發(fā)
C#發(fā)現(xiàn)之旅第一講 C#-XML開發(fā)
袁永福 2008-5-15
系列課程說明
    為了讓大家更深入的了解和使用C#,我們將開始這一系列的主題為“C#發(fā)現(xiàn)之旅”的技術(shù)講座。考慮到各位大多是進(jìn)行WEB數(shù)據(jù)庫(kù)開發(fā)的,而所謂發(fā)現(xiàn)就是發(fā)現(xiàn)我們所不熟悉的領(lǐng)域,因此本系列講座內(nèi)容將是C#在WEB數(shù)據(jù)庫(kù)開發(fā)以外的應(yīng)用。目前規(guī)劃的主要內(nèi)容是圖形開發(fā)和XML開發(fā),并計(jì)劃編排了多個(gè)課程。在未來的C#發(fā)現(xiàn)之旅中,我們按照由淺入深,循序漸進(jìn)的步驟,一起探索和發(fā)現(xiàn)C#的其他未知的領(lǐng)域,更深入的理解和掌握使用C#進(jìn)行軟件開發(fā),拓寬我們的視野,增強(qiáng)我們的軟件開發(fā)綜合能力。
本系列課程配套的演示代碼下載地址為http://www.cnblogs.com/Files/xdesigner/cs_discovery.zip 。
本系列課程已發(fā)布的文章有
C#發(fā)現(xiàn)之旅第一講 C#-XML開發(fā)
C#發(fā)現(xiàn)之旅第二講 C#-XSLT開發(fā)
C#發(fā)現(xiàn)之旅第三講 使用C#開發(fā)基于XSLT的代碼生成器
C#發(fā)現(xiàn)之旅第四講 Windows圖形開發(fā)入門
C#發(fā)現(xiàn)之旅第五講 圖形開發(fā)基礎(chǔ)篇
C#發(fā)現(xiàn)之旅第六講 C#圖形開發(fā)中級(jí)篇
C#發(fā)現(xiàn)之旅第七講 C#圖形開發(fā)高級(jí)篇
C#發(fā)現(xiàn)之旅第八講 ASP.NET圖形開發(fā)帶超鏈接的餅圖
C#發(fā)現(xiàn)之旅第九講 ASP.NET驗(yàn)證碼技術(shù)
C#發(fā)現(xiàn)之旅第十講 文檔對(duì)象模型
本課程介紹了使用C#進(jìn)行XML開發(fā)。重點(diǎn)介紹使用System.Xml名稱空間來讀取,保存和處理XML文檔。
介紹 基礎(chǔ)規(guī)范
XML全名是可擴(kuò)展標(biāo)記語言,是W3C國(guó)際標(biāo)準(zhǔn)組織規(guī)定的一種基于文本的數(shù)據(jù)存儲(chǔ)格式,它是從IBM的SGML技術(shù)派生的,HTML也是從SGML派生的。SGML內(nèi)容非常復(fù)雜,而XML使用了SGML的20%的語法實(shí)現(xiàn)了SGML的80%的功能。
從軟件開發(fā)人員的角度看, XML語法主要有
XML是國(guó)際標(biāo)準(zhǔn),絕大部分軟件廠商,開發(fā)工具和編程語言都支持相同的基本XML規(guī)范。XML文檔可用于任何開發(fā)平臺(tái)上,這是XML技術(shù)最大的優(yōu)勢(shì)。相對(duì)來說,JAVA這種非國(guó)際標(biāo)準(zhǔn)的技術(shù)跨平臺(tái)則是不太容易的。 XML是基于純文本的,XML文檔中是不能包含二進(jìn)制數(shù)據(jù)。而且存儲(chǔ)文件時(shí)會(huì)涉及到文本編碼格式的問題。 XML文件具有層次結(jié)構(gòu),其中使用一對(duì)尖括號(hào)來定義一個(gè)XML元素,一個(gè)XML元素可以包含若干個(gè)屬性,而XML元素下面可以包含若干個(gè)子XML節(jié)點(diǎn)。 一個(gè)XML文檔只能而且必須定義一個(gè)根元素,不可多定義,也不能不定義。 XML元素不能錯(cuò)亂套嵌定義,比如“<a><b></a></b>”是錯(cuò)誤的XML文檔。 XML格式是為了各系統(tǒng)交流數(shù)據(jù)而設(shè)計(jì)的,其設(shè)計(jì)過程考慮了方便的數(shù)據(jù)的臨時(shí)存儲(chǔ)和交流,而不考慮數(shù)據(jù)的長(zhǎng)期存儲(chǔ),因此XML文檔比較冗余,文件體積大,因此不適合存儲(chǔ)大數(shù)據(jù)量,網(wǎng)絡(luò)傳輸效率低。在軟件開發(fā)中需要注意到這個(gè)問題。
XPath是W3C國(guó)際標(biāo)準(zhǔn)組織提出的在一個(gè)XML文檔中快速檢索和定位XML節(jié)點(diǎn)的標(biāo)準(zhǔn)。關(guān)于它將在下節(jié)課程詳細(xì)介紹。
XSLT也是W3C國(guó)際標(biāo)準(zhǔn)組織在XML標(biāo)準(zhǔn)的基礎(chǔ)上提出的XML文檔轉(zhuǎn)換的標(biāo)準(zhǔn),它是一種非常重要的XML應(yīng)用,它也是跨平臺(tái)的,受到眾多軟件廠商的支持。在下節(jié)課程將詳細(xì)介紹XSLT。
此處多次提到W3C國(guó)際標(biāo)準(zhǔn)組織,那么到底什么是W3C國(guó)際標(biāo)準(zhǔn)組織呢?
W3C是大部分軟件企業(yè)聯(lián)合起來制定某些重要軟件業(yè)標(biāo)準(zhǔn)的國(guó)際組織。它的成員包括微軟,IBM,SUN等軟件巨頭。它制定和維護(hù)了HTML,XHTML,HTTP,XML,VML,XPath,XForm等軟件行業(yè)內(nèi)重要的標(biāo)準(zhǔn),絕大多數(shù)軟件廠商都支持W3C制定的標(biāo)準(zhǔn),它制定的標(biāo)準(zhǔn)是真正的跨平臺(tái)的全球通用的。因此它對(duì)全球軟件業(yè)界,尤其是WEB軟件業(yè)界有著巨大的影響。它的網(wǎng)址是http://www.w3c.org/,在它的網(wǎng)站上可以看到它所制定的上百個(gè)標(biāo)準(zhǔn)。大家若要開發(fā)具有國(guó)際水平的WEB應(yīng)用系統(tǒng),應(yīng)當(dāng)要好好學(xué)習(xí)W3C的某些標(biāo)準(zhǔn)。
在這里說明一下國(guó)際標(biāo)準(zhǔn)的意義。
所謂國(guó)際標(biāo)準(zhǔn)就是某個(gè)權(quán)威的非營(yíng)利性的國(guó)際組織,其立場(chǎng)中立,不代表某個(gè)具體的公司,而是代表整個(gè)業(yè)界。它針對(duì)某項(xiàng)普遍使用的技術(shù)出臺(tái)一些規(guī)范和標(biāo)準(zhǔn)。而各個(gè)具體的軟件廠商在運(yùn)用這項(xiàng)技術(shù)時(shí)自覺遵守這套國(guó)際標(biāo)準(zhǔn)。這樣能方便各個(gè)系統(tǒng)之間交流數(shù)據(jù),保障異構(gòu)系統(tǒng)進(jìn)行集成,并保持?jǐn)?shù)據(jù)結(jié)構(gòu)的長(zhǎng)期穩(wěn)定性和兼容性。這樣的國(guó)際組織有ISO,ECMA和W3C等等。
我們使用到的一些技術(shù)都已經(jīng)成為國(guó)際標(biāo)準(zhǔn),例如SQL,JavaScript,C#,HTML,XML,XSLT,HTTP等很多技術(shù)。
國(guó)際標(biāo)準(zhǔn)具有一些特點(diǎn),首先是穩(wěn)定性和連貫性,國(guó)際標(biāo)準(zhǔn)一旦正式發(fā)布,就保持了相當(dāng)?shù)姆€(wěn)定性,其內(nèi)容只能慎重的增加而不能刪減,國(guó)際標(biāo)準(zhǔn)組織不會(huì)輕易修改已經(jīng)正式發(fā)布的國(guó)際標(biāo)準(zhǔn),而且在修改標(biāo)準(zhǔn)時(shí)會(huì)充分考慮到各種因素,保證向上和向下的兼容性,能最大程度的保障業(yè)界在舊標(biāo)準(zhǔn)上的投資。而且這些國(guó)際組織發(fā)布國(guó)際標(biāo)準(zhǔn)時(shí)有時(shí)會(huì)事先提出標(biāo)準(zhǔn)的修訂計(jì)劃。
其次國(guó)際標(biāo)準(zhǔn)是全球業(yè)界都遵守的,雖然沒有強(qiáng)制遵守的機(jī)制,但絕大多數(shù)軟件廠商都會(huì)遵守或者努力遵守這些國(guó)際標(biāo)準(zhǔn)。而且國(guó)際標(biāo)準(zhǔn)組織的成員有很多大軟件廠商,比如W3C的成員就有微軟,IBM,SUN等大公司。因此國(guó)際標(biāo)準(zhǔn)是代表了最廣大軟件業(yè)界的根本利益,代表了最先進(jìn)的軟件生產(chǎn)力。
對(duì)于應(yīng)用軟件開發(fā)商,充分的運(yùn)用國(guó)際標(biāo)準(zhǔn)能很大程度的保護(hù)客戶在IT系統(tǒng)上的投資。由于國(guó)際標(biāo)準(zhǔn)具有相當(dāng)?shù)姆€(wěn)定性和連貫性,若客戶IT系統(tǒng)充分的使用了這些國(guó)際標(biāo)準(zhǔn),則在升級(jí)到新標(biāo)準(zhǔn)時(shí)能獲得很好的兼容性。IT系統(tǒng)不用推倒重來,這樣能保護(hù)客戶在已有系統(tǒng)上的投資。
作為軟件開發(fā)人員,也應(yīng)當(dāng)了解這些國(guó)際標(biāo)準(zhǔn),首先是能比較容易的實(shí)現(xiàn)異構(gòu)系統(tǒng)的集成,并能獲得比較好的系統(tǒng)兼容性和可維護(hù)性。而且軟件開發(fā)人員在切換開發(fā)平臺(tái),比如從Java轉(zhuǎn)移到.NET平臺(tái)上時(shí),以前學(xué)習(xí)國(guó)際標(biāo)準(zhǔn)的投資就會(huì)得到保護(hù),而遵守相同標(biāo)準(zhǔn)的源代碼的移植和翻譯也是低成本的。
框架對(duì)XML的支持
.NET框架提供了對(duì)XML的強(qiáng)大支持,而且.NET框架本身也普遍采用XML格式來存儲(chǔ)各種配置信息。比如web.config文件。
在.NET類庫(kù)中,名稱空間System.Xml下面就包含了大量的操作XML文檔的類型。這些類型構(gòu)成了兩種XML文檔的處理模型。
在流式處理模型中,我們將XML文檔做作一個(gè)數(shù)據(jù)流來進(jìn)行處理,我們將逐個(gè)處理XML文檔中的數(shù)據(jù),在這種模型下,我們可以只讀的快速讀取大體積的XML文檔,而且內(nèi)存占用少,程序性能好。類型System.Xml.XmlReader就提供了流式處理模型,使用XmlReader就可以快速讀取XML文檔。
使用流式處理模型是有缺點(diǎn)的,首先是它只能讀取XML文檔,不能修改XML文檔;其次是檢索XML文檔內(nèi)容不方便,不能使用XPath技術(shù);而且編程接口比較簡(jiǎn)單,處理XML文檔不夠方便。當(dāng)程序需要比較簡(jiǎn)單的從XML文檔讀取數(shù)據(jù)則可以采用流式處理模型。
處理模型
在DOM處理模型中,我們首先是使用文檔對(duì)象模型的思想解析整個(gè)XML文檔,在內(nèi)存中生成一個(gè)對(duì)象樹來表述XML文檔。比如使用一個(gè)XmlElement對(duì)象來影射到XML文檔中的一個(gè)元素,使用XmlAttribute對(duì)象來影射到XML文檔中的一個(gè)屬性。這樣我們編程操作內(nèi)存中的對(duì)象就影射為操作XML文檔。
使用DOM處理XML文檔具有相當(dāng)大的優(yōu)點(diǎn),首先是處理方便,我們可以使用各種編程技巧來處理XML文檔對(duì)象樹狀結(jié)構(gòu),比如可以遞歸遍歷XML文檔的一部分或全部,可以向樹狀結(jié)構(gòu)插入,修改或刪除XML元素,可以設(shè)置XML元素的屬性。
在DOM模式下,我們可以使用XPath技術(shù)在XML文檔樹狀結(jié)構(gòu)中進(jìn)行快速檢索和定位,這為處理XML文檔帶來比較大的方便。
在C#中,我們可以很簡(jiǎn)單的使用DOM方式處理XML文檔。我們首先實(shí)例化一個(gè)System.Xml.XmlDocument類型,調(diào)用它的Load方法既可加載XML文檔并生成XML節(jié)點(diǎn)對(duì)象樹狀結(jié)構(gòu),然后我們就可以遍歷這個(gè)對(duì)象樹,新增修改和刪除節(jié)點(diǎn),而且其中的任意一個(gè)節(jié)點(diǎn)都可以使用SelectNodes或SelectSingleNode方法通過XPath相對(duì)路徑快速查找其它的節(jié)點(diǎn)。
在名稱空間System.Xml下面大部分類型都是用來支持DOM處理模型的。其中很多類型配合起來共同組織成XMLDOM,XMLDOM是一種很典型的文檔對(duì)象模型的應(yīng)用。文檔對(duì)象模型是一種比較高級(jí)的軟件設(shè)計(jì)模式,我會(huì)在今后的課程中詳細(xì)介紹文檔對(duì)象模型這種軟件設(shè)計(jì)模式。
System.Xml名稱空間下的支持DOM的類型主要有
XmlNode 是DOM結(jié)構(gòu)中的所有類型的基礎(chǔ)類型,它定義了所有XML節(jié)點(diǎn)的通用屬性和方法,是XMLDOM的基礎(chǔ)。它具有一個(gè)ChildNodes屬性,表示它所包含的子XML節(jié)點(diǎn)。
XmlAttribute 表示XML屬性,它只保存在XmlElement的Attributes 列表中。
XmlDocument表示XML文檔本身,是XMLDOM模型中的頂級(jí)對(duì)象,它用于對(duì)XML文檔進(jìn)行整體的控制,并且是其它程序訪問XML文檔對(duì)象樹的唯一入口。
XmlLinkedNode在XmlNode的基礎(chǔ)上實(shí)現(xiàn)了訪問前后同級(jí)節(jié)點(diǎn)的方法。
XmlElement元素表示XML元素。是XMLDOM中使用最多的對(duì)象類型。它具有Attributes屬性可以處理它所擁有的屬性,可以使用ChildNodes屬性獲得它所有的子節(jié)點(diǎn)。并提供了一些添加和刪除子節(jié)點(diǎn)的方法。
XmlCharacterData表示XML文檔中的字符數(shù)據(jù)的基礎(chǔ)類型。字符文本數(shù)據(jù)是分布在各個(gè)XMLElement之間的純文本數(shù)據(jù)。XmlAttribute中的文本數(shù)據(jù)是不屬于XML文本塊的。
XmlCDataSection 表示XML文檔中CData節(jié),CData數(shù)據(jù)是采用”<![CDATA[     ]]>”包括起來的純文本數(shù)據(jù)。由于XML采用尖括號(hào)進(jìn)行標(biāo)記,因此具有和HTML類似的轉(zhuǎn)義字符,在一般的XML純文本段中若遇到尖括號(hào)等特殊字符時(shí)需要使用轉(zhuǎn)義字符,當(dāng)文本段中包含大量的這類特殊字符時(shí),手工書寫和察看XML文檔將比較困難,為了改善XML文檔的可讀性,在此可以使用CDATA節(jié)。在CDATA節(jié)中,所有的字符,包括特殊字符都不需要轉(zhuǎn)義,這樣察看和修改XML文檔都比較方便。
XmlComment表示一段注釋,XML注釋和HTML注釋一樣,使用一對(duì)”<!--   -->”來包含起來。
XmlText表示一段純文本數(shù)據(jù)。
XmlWhitespace表示XML文檔中一段純粹由空白字符組成的文本塊,空白字符包括空格,制表符,換行和回車符,全角空格不屬于空白字符。XmlDocument在解析XML文檔時(shí)會(huì)處理空白字符,當(dāng)XmlDocument對(duì)象的PreserveWhiitespace屬性為true時(shí),會(huì)為XML文檔中的純空白文本塊生成XmlWhitespace對(duì)象,若該屬性為false時(shí),則會(huì)忽略掉純空白文本,不會(huì)生成XmlWhitespace對(duì)象,好像原始的XML文檔中不存在這樣的空白文本塊一樣。
除了流式處理模型和DOM處理模型外,還存在一些比較另類的使用比較少的處理模型,在此簡(jiǎn)單介紹一下
DBDOM
DBDOM是一種基于數(shù)據(jù)庫(kù)的XML文檔處理模型,它是一個(gè)開源項(xiàng)目。它采用大量的存儲(chǔ)過程和數(shù)據(jù)庫(kù)操作,將一個(gè)個(gè)XML元素,XML屬性等信息保存到數(shù)據(jù)庫(kù)的字段中。使用關(guān)系型數(shù)據(jù)庫(kù)來模擬實(shí)現(xiàn)XML的樹狀結(jié)構(gòu)。我對(duì)這個(gè)模型也不甚了解,只是知道大概的原理。
BinaryXML
DOM方式處理XML文檔是需要消耗大量的內(nèi)存的,在處理大型XML文檔時(shí),DOM方式會(huì)比較大的影響應(yīng)用系統(tǒng)的性能的。為此有人開始提出BinaryXML的處理模型。在這個(gè)模型中,XML文檔是當(dāng)作二進(jìn)制數(shù)據(jù)加載到內(nèi)存中,然后解析文檔,使用大量的指針來指向XML文檔中的關(guān)鍵位置,通過指針可以快速定位XML文檔,能修改XML文檔,并能提供類似DOM的編程接口。這種方式能大大節(jié)省內(nèi)存,所消耗的內(nèi)存僅比XML文件大小稍微大些。但實(shí)際運(yùn)行效果我也不清楚。
對(duì)WEB開發(fā)的意義
XML技術(shù)對(duì)WEB開發(fā)具有重大意義。若要開發(fā)高水平的WEB系統(tǒng),應(yīng)當(dāng)好好使用XML技術(shù)。
和HTML
XML和HTML都源自SGML,具有相同的來源,而且兩者都是采用尖括號(hào)的標(biāo)記語言,兩者具有很大的相似性。使用XML完全可以模擬出HTML,而且W3C提出了現(xiàn)代WEB站點(diǎn)應(yīng)當(dāng)采用的XHTML標(biāo)準(zhǔn)就是XML和HTML的結(jié)合。
在使用ASP.NET開發(fā)WEB系統(tǒng)中,除了使用ASP.NET控件展示數(shù)據(jù)外,還需要由程序拼湊出大量的HTML代碼來展現(xiàn)數(shù)據(jù)。簡(jiǎn)單的進(jìn)行字符串連接操作來生成HTML頁面不是一種可持續(xù)性的軟件開發(fā)和維護(hù)的過程。程序代碼很容易雜亂無章,生成的HTML代碼可讀性不好。若在生成HTML代碼的過程借鑒XML技術(shù)則有助于改善這種問題,從而能更好的控制WEB軟件的開發(fā)過程,提高軟件質(zhì)量。
和WebService
WebService基礎(chǔ)就是XML,WebService的原理是將編程對(duì)象序列化成一個(gè)XML文檔,然后通過HTTP協(xié)議傳遞給客戶端,客戶端接受這個(gè)XML文檔,通過反序列化重現(xiàn)編程對(duì)象。因此WebService的基礎(chǔ)就是XML序列化技術(shù)。在開發(fā)和調(diào)試稍微復(fù)雜的WebService是需要一定的XML技術(shù)基礎(chǔ)。
Ajax技術(shù)的底層也是使用XML來傳遞數(shù)據(jù)的,可以看作一種特殊的WebService??梢赃@樣比喻,WebService是WEB系統(tǒng)的公開方法,而Ajax則是私有方法。
提供一種全新的開發(fā)模式
XML/XSLT兩項(xiàng)技術(shù)的配合可以提供一種全新的WEB系統(tǒng)開發(fā)模式。在這種模式下,頁面將需要顯示的純粹的數(shù)據(jù)組織生成一個(gè)XML文檔,并配上XSL轉(zhuǎn)換信息頭,然后發(fā)送到客戶端,在客戶端IE瀏覽器接受解析XML文檔,根據(jù)其中的XSL轉(zhuǎn)換頭信息再下載XSLT文檔,執(zhí)行XSLT轉(zhuǎn)換,然后才顯示轉(zhuǎn)換的結(jié)果。此時(shí)WEB頁面既能正常的使用指定的格式顯示數(shù)據(jù),而且本身就是一個(gè)可供其它程序調(diào)用的WebService。該頁面的輸出的源代碼就是XML文檔,而且只有IE等瀏覽器類型軟件才處理XSLT轉(zhuǎn)換信息頭,其他程序是會(huì)忽略掉這個(gè)信息的。此時(shí)頁面具有雙重功能,便于代碼的集成開發(fā)和維護(hù)。
關(guān)于XSLT下節(jié)課程將詳細(xì)介紹。
輸出XML
接下來我們將使用C#進(jìn)行實(shí)際的XML開發(fā),由于XML技術(shù)對(duì)WEB開發(fā)特別有用,因此將使用ASP.NET來演示使用C#進(jìn)行XML開發(fā)。此處演示程序已經(jīng)寫好,現(xiàn)在對(duì)程序代碼進(jìn)行詳細(xì)說明。
本程序是一個(gè)ASP.NET程序,大家獲得程序代碼后要在IIS中設(shè)置虛擬目錄,由于程序還需要訪問程序目錄下的一些文件,因此還需要進(jìn)行一些權(quán)限的配置。程序目錄下的 demomdb.mdb 是程序使用的數(shù)據(jù)庫(kù)文件。
網(wǎng)站配置完畢后,我們?cè)跒g覽器中輸入網(wǎng)站的地址即可打開它的默認(rèn)頁面??梢钥吹侥J(rèn)頁面上有些程序內(nèi)容的簡(jiǎn)單說明。
首先我們看看 recordxml.aspx 頁面,我們看看 recordxml.aspx 的 HTML頁面代碼,可以看到該頁面HTML代碼很簡(jiǎn)單,只有一行。因此該頁面的所有內(nèi)容都是用C#代碼生成的。
我們切換到該頁面的C#代碼,可以看到在 Page_Load 函數(shù)里面添加了代碼輸出頁面內(nèi)容。代碼內(nèi)容為
// 此處使用 XmlTextWriter 來快速輸出XML文檔內(nèi)容.不構(gòu)造XML文檔對(duì)象結(jié)構(gòu)
this.Response.ContentEncoding = System.Text.Encoding.GetEncoding( 936 );
this.Response.ContentType = "text/xml";
// 連接數(shù)據(jù)庫(kù)
using( System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection())
{
conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
+ this.Server.MapPath("demomdb.mdb");
conn.Open();
// 查詢數(shù)據(jù)庫(kù)
using( System.Data.OleDb.OleDbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "Select * From Customers";
System.Data.OleDb.OleDbDataReader reader = cmd.ExecuteReader();
// 獲得所有字段名
int FieldCount = reader.FieldCount ;
string[] FieldNames = new string[ FieldCount ] ;
for( int iCount = 0 ; iCount < FieldCount ; iCount ++ )
{
FieldNames[ iCount ] = reader.GetName( iCount );
}
// 生成一個(gè)XML文檔書寫器
System.Xml.XmlTextWriter xmlwriter = new System.Xml.XmlTextWriter( this.Response.Output );
xmlwriter.Indentation = 3 ;
xmlwriter.IndentChar = ' ';
xmlwriter.Formatting = System.Xml.Formatting.Indented ;
// 開始輸出XML文檔
xmlwriter.WriteStartDocument();
// 輸出XSLT樣式表信息頭
string strXSLRef = this.Request.QueryString["xsl"] ;
if( strXSLRef != null && strXSLRef.Length > 0 )
{
xmlwriter.WriteProcessingInstruction(
"xml-stylesheet" ,
"type='text/xsl' href='" + strXSLRef + "'");
}
xmlwriter.WriteStartElement("Table");
while( reader.Read())
{
// 輸出一條記錄
xmlwriter.WriteStartElement("Record");
for( int iCount = 0 ; iCount < FieldCount ; iCount ++ )
{
// 輸出一個(gè)字段值
xmlwriter.WriteStartElement( FieldNames[ iCount ] );
object v = reader.GetValue( iCount );
if( v == null || DBNull.Value.Equals( v ))
{
xmlwriter.WriteAttributeString("Null" , "1");
}
else
{
xmlwriter.WriteString( Convert.ToString( v ));
}
xmlwriter.WriteEndElement();
}
xmlwriter.WriteEndElement();
}//while( reader.Read())
reader.Close();
xmlwriter.WriteEndElement();
xmlwriter.WriteEndDocument();
xmlwriter.Close();
}//using( System.Data.OleDb.OleDbCommand cmd = conn.CreateCommand())
}//using( System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection())
Page_Load 函數(shù)的執(zhí)行流程為
輸出類型
首先設(shè)置HTTP的輸出類型,我們?cè)O(shè)置輸出的編碼格式為 GB2312,此處使用 GetEncoding(936 ) 就是獲得GB2312的編碼格式。
我們還設(shè)置 ContentType 來設(shè)置文檔的輸出格式。大家若了解一些HTTP傳輸協(xié)議的都知道,ContentType屬性描述了文檔輸出類型,當(dāng)文檔傳遞到客戶端時(shí),客戶端瀏覽器獲得ContentType屬性值,查詢注冊(cè)表和Windows中注冊(cè)的COM信息,獲得該屬性值確定的文件類型,然后使用相應(yīng)的模式顯示文檔。比如若設(shè)置ContentType屬性為application/vnd.ms-excel ,則客戶端瀏覽器查詢注冊(cè)表得知對(duì)應(yīng)的文件類型信息在注冊(cè)項(xiàng)目 HKEY_CLASS_ROOT\.xls下面,本地文件類型為”Excel.Sheet.8”,然后又根據(jù)其他信息轉(zhuǎn)而調(diào)用EXCEL的COM組件來顯示獲得的HTTP文檔。
從ContentType屬性的說明我們可以了解,很深入的掌握WEB開發(fā),有時(shí)候是需要了解一些Windows編程的知識(shí),因?yàn)锽/S系統(tǒng)的客戶端,也就是各種瀏覽器,特別是IE瀏覽器就是比較復(fù)雜的Windows程序。
設(shè)置了HTTP文檔輸出模式后,我們開始輸出XML文檔內(nèi)容,首先是連接數(shù)據(jù)庫(kù),使用了程序目錄下的demomdb.mdb數(shù)據(jù)庫(kù),執(zhí)行一個(gè)SQL查詢,獲得一個(gè)數(shù)據(jù)讀取器reader。
輸出XML文檔
查詢得到數(shù)據(jù)后,我們就可以遍歷查詢所得的數(shù)據(jù)庫(kù)記錄,開始輸出XML文檔,此處我們使用XmlTextWriter輸出文檔。
輸出XML文檔我們有兩種方式,一種是使用XmlTextWriter輸出,另外一種是從XmlDocument類型開始構(gòu)造XML文檔對(duì)象結(jié)構(gòu),然后使用XmlDocument的Save方法輸出XML文檔。兩種方法有各自特點(diǎn)。
使用XmlTextWriter是只寫的向前的快速輸出XML文檔,而且輸出時(shí)不能訪問已經(jīng)輸出的XML文檔內(nèi)容,不能修改已經(jīng)生成的XML文檔。這種方法速度快,占用內(nèi)存少,但不夠靈活。
而使用XmlDocument類型構(gòu)造XML文檔結(jié)構(gòu)后再輸出XML文檔的方法比較靈活,我們可以隨時(shí)訪問和修改已經(jīng)輸出的Xml文檔。這種方法速度慢,占用內(nèi)存多,但很靈活。
在這里我們要嘗試使用XmlTextWriter來輸出XML文檔,在另外的一個(gè)頁碼使用XmlDocument輸出XML文檔。
我們首先在頁面輸出流上新建一個(gè)XmlTextWriter對(duì)象,設(shè)置它啟動(dòng)縮進(jìn)。它的Indentation,IndentChar和Formating就是控制縮進(jìn)樣式,具體說明可以查看MSDN。XML文檔縮進(jìn)是為了改善XML文檔的可讀性,有縮進(jìn)的XML文檔便于人們直接閱讀和修改,但對(duì)應(yīng)用程序來說,XML文檔是否有縮進(jìn)是沒差別的。
XmlTextWriter是一個(gè)基于其他流的針對(duì)輸出XML文檔的包裝,它本身不能打開文件,因此在初始化XmlTextWriter時(shí)必須指明底層的輸出對(duì)象,輸出對(duì)象可以為流或者文本書寫器。理論上我們可以使用字符串拼湊來生成XML文檔,但實(shí)際開發(fā)中使用字符串拼湊XML文檔不是明智之舉,建議使用XmlTextWriter。
我們?cè)趙eb開發(fā)中有時(shí)會(huì)使用字符串拼湊來生成HTML文檔,由于HTML文檔沒有很嚴(yán)格的語法限制,IE瀏覽器能解釋劣質(zhì)的HTML代碼,因此有時(shí)會(huì)有開發(fā)者這樣字符串拼湊HTML文檔,但這會(huì)導(dǎo)致代碼比較雜亂,可讀性不好。而XML文檔具有很嚴(yán)格的語法檢查,只要一個(gè)XML語法錯(cuò)誤就會(huì)導(dǎo)致整個(gè)XML文檔解析錯(cuò)誤,因此我們應(yīng)當(dāng)使用XmlTextWriter,因此它能幫助我們檢查基本的XML語法,確保我們能輸出合格的XML文檔。
我們調(diào)用WriteStartDocument來開始輸出XML文檔,XmlTextWriter提供了很多配對(duì)使用的成員,使用一個(gè)方法后需要使用另外一個(gè)配對(duì)的方法。比如WriteStartDocument和WriteEndDocument配對(duì),WriteStartElement和WriteEndElement配對(duì),配對(duì)的方法必須成對(duì)調(diào)用。此處我們使用WriteStartDocument開始書寫Xml文檔,我們就必須使用WriteEndDocument 來完成輸出XML文檔的。而且在使用XmlTextWriter輸出XML文檔的時(shí)候,WriteStartDocument必須是第一個(gè)調(diào)用的方法。
然后我們使用一個(gè)名稱為xsl的頁面參數(shù)來輸出XML文檔的xml-stylesheet信息頭,關(guān)于XSL下節(jié)課將詳細(xì)介紹,在本節(jié)課不管這個(gè)參數(shù)。
我們調(diào)用WriteStartElement 方法來輸出XML文檔的根節(jié)點(diǎn),這里參數(shù)為字符串 “Table” , 則表示輸出的XML文檔的根節(jié)點(diǎn)名稱為Table。
然后我們使用數(shù)據(jù)庫(kù)數(shù)據(jù)讀取器的Read函數(shù)來遍歷所有的查詢的數(shù)據(jù),對(duì)于每一條記錄,使用XML書寫器的WriteStartElement方法來輸出XML元素,這里參數(shù)為字符串”Record”,表示輸出的XML元素名為Record,而且這個(gè)節(jié)點(diǎn)添加到XML文檔的根節(jié)點(diǎn)下。
對(duì)于每一條記錄我們還遍歷其所有的字段值,對(duì)每一個(gè)字段值使用WriteStartElement新增一個(gè)XML元素,元素名稱就是各個(gè)字段的名稱。若字段值是空則使用WriteAttributeString輸出名為Null 的XML屬性,否則使用WriteString來輸出字段值的字符串表達(dá)值。
由于WriteStartElement和WriteEndElement配對(duì)使用,因此每輸出完一個(gè)XML元素后需要調(diào)用WriteEndElement來結(jié)束輸出XML元素。當(dāng)所有的內(nèi)容輸出完畢后我們調(diào)用WriteEndDocument來結(jié)束輸出整個(gè)XML文檔的。
輸出XML文檔    頁面record.aspx功能和recordxml.aspx類似。但它使用 XmlDocument來構(gòu)造XML文檔對(duì)象結(jié)構(gòu),然后輸出XML文檔?,F(xiàn)對(duì)其過程進(jìn)行說明。
打開record.aspx的HTML代碼,可以看到代碼非常簡(jiǎn)單,只有一行,所有的頁面輸出都在程序代碼中實(shí)現(xiàn)。打開它的C#代碼,可以看到在Page_Load 方法中添加了代碼執(zhí)行頁面輸出,其代碼為
// 此處代碼動(dòng)態(tài)構(gòu)造 XmlDocument對(duì)象 來輸出XML文檔
System.Xml.XmlDocument XmlDoc = new System.Xml.XmlDocument();
XmlDoc.AppendChild( XmlDoc.CreateElement("Table"));
// 連接數(shù)據(jù)庫(kù)
using( System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection())
{
conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
+ this.Server.MapPath("demomdb.mdb");
conn.Open();
// 查詢數(shù)據(jù)庫(kù)
using( System.Data.OleDb.OleDbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "Select * From Customers";
System.Data.OleDb.OleDbDataReader reader = cmd.ExecuteReader();
// 獲得所有字段名
int FieldCount = reader.FieldCount ;
string[] FieldNames = new string[ FieldCount ] ;
for( int iCount = 0 ; iCount < FieldCount ; iCount ++ )
{
FieldNames[ iCount ] = reader.GetName( iCount );
}
while( reader.Read())
{
// 輸出一條記錄
System.Xml.XmlElement RecordElement = XmlDoc.CreateElement("Record");
XmlDoc.DocumentElement.AppendChild( RecordElement );
for( int iCount = 0 ; iCount < FieldCount ; iCount ++ )
{
// 輸出一個(gè)字段值
System.Xml.XmlElement FieldElement = XmlDoc.CreateElement( FieldNames[ iCount ] );
RecordElement.AppendChild( FieldElement );
object v = reader.GetValue( iCount );
if( v == null || DBNull.Value.Equals( v ))
{
FieldElement.SetAttribute("Null" , "1" );
}
else
{
FieldElement.AppendChild( XmlDoc.CreateTextNode( Convert.ToString( v )));
}
}
}//while( reader.Read())
reader.Close();
}//using( System.Data.OleDb.OleDbCommand cmd = conn.CreateCommand())
}//using( System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection())
string strXSLRef = this.Request.QueryString["xsl"] ;
if( strXSLRef != null && strXSLRef.Length > 0 )
{
// 根據(jù)頁面參數(shù)指定的XSLT樣式表名稱執(zhí)行XSLT轉(zhuǎn)換
strXSLRef = this.Server.MapPath( strXSLRef );
System.Xml.Xsl.XslTransform transform = new System.Xml.Xsl.XslTransform();
transform.Load( strXSLRef );
transform.Transform( XmlDoc , null , this.Response.Output , null );
}
else
{
// 直接輸出生成的XML文檔
this.Response.Write( XmlDoc.DocumentElement.OuterXml );
}
現(xiàn)對(duì)該方法的執(zhí)行過程進(jìn)行說明。
首先是創(chuàng)建一個(gè)XmlDocument對(duì)象,XmlDocument創(chuàng)建時(shí)是一個(gè)空的XML文檔,沒有任何內(nèi)容,沒有根元素,因此第一步就是使用文檔對(duì)象的AppendChild方法來添加根元素。在這里我們使用了文檔對(duì)象的CreateElement函數(shù)來創(chuàng)建一個(gè)名為Table的XMLElement元素對(duì)象。
各種類型的XML文檔對(duì)象,包括元素,屬性,文本塊,注釋等等,都不能直接實(shí)例化,只能使用XmlDocument的一系列以Create開頭的函數(shù)來創(chuàng)建對(duì)象實(shí)例。創(chuàng)建的XML文檔對(duì)象是一個(gè)個(gè)離散的對(duì)象,必須及時(shí)的添加到XML文檔對(duì)象結(jié)構(gòu)中才能真正成為XML文檔的一部分。一般的使用XML文檔對(duì)象或元素對(duì)象的AppendChild方法將新創(chuàng)建的XML文檔對(duì)象添加到指定對(duì)象下面,如此才加入了XML文檔結(jié)構(gòu)的大家庭中。
這種處理模式類似向DataTable添加新的數(shù)據(jù)行。DataRow本身不能直接實(shí)例化,我們首先得使用DataTable 的NewRow創(chuàng)建一個(gè)新的DataRow,然后使用DataTable的Rows屬性的Add方法向數(shù)據(jù)表添加剛剛創(chuàng)建的數(shù)據(jù)行。
初始化一個(gè)XML文檔對(duì)象后,我們連接數(shù)據(jù)庫(kù),查詢數(shù)據(jù)庫(kù)獲得一個(gè)數(shù)據(jù)讀取器,然后遍歷查詢所得的數(shù)據(jù)庫(kù)記錄,輸出XML文檔。
對(duì)每一個(gè)數(shù)據(jù)庫(kù)記錄,首先創(chuàng)建一個(gè)RecordElement對(duì)象,添加到XML文檔的根節(jié)點(diǎn)下,然后遍歷數(shù)據(jù)庫(kù)記錄的每一個(gè)字段值,創(chuàng)建一個(gè)FieldElement對(duì)象并添加到RecordElement下面,若當(dāng)前數(shù)據(jù)庫(kù)字段值為空,則調(diào)用FieldElement的SetAttribute 方法,設(shè)置名為Null的屬性值為1,否則向FieldElement添加一個(gè)XML文本節(jié)點(diǎn)。
完成生成XML文檔后,我們就向頁面輸出XML文檔的內(nèi)容,若頁面參數(shù)中指定了XSLT轉(zhuǎn)換文檔名稱則執(zhí)行XSLT轉(zhuǎn)換,并輸出轉(zhuǎn)換結(jié)果。關(guān)于XSLT下節(jié)課程將詳細(xì)說明。
若未指明XSLT轉(zhuǎn)換信息,則輸出XML文檔根節(jié)點(diǎn)的外圍XML字符串。
每一個(gè)XML文檔對(duì)象都具有InnerXml屬性和OuterXml屬性,這兩個(gè)屬性都直接返回表示該XML文檔片斷的不帶縮進(jìn)的XML字符串,但兩者有差別。InnerXml返回表示該節(jié)點(diǎn)所有子孫節(jié)點(diǎn)的XML字符串。而OuterXml返回表示該節(jié)點(diǎn)本身和所有子孫節(jié)點(diǎn)的XML字符串。例如對(duì)于XML文檔”<a><b />123</a>”,則它的根節(jié)點(diǎn)的InnerXml就是”<b />123”,而它的根節(jié)點(diǎn)的OuterXml就是”<a><b />123</a>”。注意這個(gè)字符串是不帶縮進(jìn)的。而XML文檔直接保存到指定名稱的文件中是帶縮進(jìn)的。
在IE瀏覽器中查看該頁面,可以看到IE只是顯示XML文檔中的純文本內(nèi)容,并不像顯示其他XML文檔時(shí)的那種帶縮進(jìn)的顯示。這是因?yàn)樵揂SPX的代碼中沒有設(shè)置ContentType為XML格式,而是使用默認(rèn)的HTML格式,因此IE瀏覽器接受該頁面文檔代碼,并把它當(dāng)作HTML進(jìn)行解析和顯示,由于Table,Record等XML名稱都不是HTML標(biāo)簽,因此IE瀏覽器忽略掉這些XML標(biāo)記,只顯示出其中的純文本內(nèi)容。但你查看該頁面的源代碼,可以看出該文檔的內(nèi)容仍然是標(biāo)準(zhǔn)的XML格式,這里的源代碼沒有縮進(jìn)處理。
在本課程中,我們簡(jiǎn)單介紹了XML的基本語法,說明了處理XML文檔的流式處理模式和DOM處理模式。還使用C#演示了輸出XML文檔。
XML是一項(xiàng)不簡(jiǎn)單的技術(shù),而且在其上面派生了很多其他的技術(shù),作為當(dāng)代的軟件開發(fā)人員,尤其是WEB開發(fā)人員,應(yīng)當(dāng)熟練掌握和使用XML技術(shù)及其某些派生技術(shù),熟悉XML技術(shù)有助于開發(fā)者長(zhǎng)期保持相當(dāng)水平的軟件開發(fā)能力,也是學(xué)習(xí)其他先進(jìn)生產(chǎn)力的重要基礎(chǔ)。大家應(yīng)當(dāng)好好學(xué)習(xí)XML技術(shù)。
posted on 2008-05-15 15:41袁永福 閱讀(4307)評(píng)論(42)  編輯收藏
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
XmlDocument類的WriteContentTo和WriteTo方法
如何完成.Net下XML文檔的讀寫操作
XML 文檔對(duì)象模型 (DOM)
C# 寫入XML文檔三種方法詳細(xì)介紹
一個(gè)經(jīng)過改良的XMLHelper(包含了序列化,反序列化,創(chuàng)建xml文件,讀取節(jié)點(diǎn),C#對(duì)...
在C#.net中怎么操作XML
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服