C#-XML開發

來源:互聯網
上載者:User

課程說明

    本課程介紹了使用C#進行XML開發。重點介紹使用System.Xml名稱空間來讀取,儲存和處理XML文檔。

XML介紹 XML基礎規範

    XML全名是可延伸標記語言 (XML),是W3C國際標準組織規定的一種基於文本的資料存放區格式,它是從IBM的SGML技術派生的,HTML也是從SGML派生的。SGML內容非常複雜,而XML使用了SGML的20%的文法實現了SGML的80%的功能。

    從軟體開發人員的角度看, XML文法主要有

  1. XML是國際標準,絕大部分軟體廠商,開發工具和程式設計語言都支援相同的基本XML規範。XML文檔可用於任何開發平台上,這是XML技術最大的優勢。相對來說,JAVA這種非國際標準的技術跨平台則是不太容易的。
  2. XML是基於純文字的,XML文檔中是不能包含位元據。而且隱藏檔時會涉及到文本編碼格式的問題。
  3. XML檔案具有階層,其中使用一對角括弧來定義一個XML元素,一個XML元素可以包含若干個屬性,而XML元素下面可以包含若干個子XML節點。
  4. 一個XML文檔只能而且必須定義一個根項目,不可多定義,也不能不定義。
  5. XML元素不能錯亂套嵌定義,比如“<a><b></a></b>”是錯誤的XML文檔。
  6. XML格式是為了各系統交流資料而設計的,其設計過程考慮了方便的資料的臨時儲存和交流,而不考慮資料的長期儲存,因此XML文檔比較冗餘,檔案體積大,因此不適合儲存大資料量,網路傳輸效率低。在軟體開發中需要注意到這個問題。

XPath

    XPath是W3C國際標準組織提出的在一個XML文檔中快速檢索和定位XML節點的標準。關於它將在下節課程詳細介紹。

XSLT

    XSLT也是W3C國際標準組織在XML標準的基礎上提出的XML文檔轉換的標準,它是一種非常重要的XML應用,它也是跨平台的,受到眾多軟體廠商的支援。在下節課程將詳細介紹XSLT。

W3C

    此處多次提到W3C國際標準組織,那麼到底什麼是W3C國際標準組織呢?

    W3C是大部分軟體企業聯合起來制定某些重要軟體業標準的國際組織。它的成員包括微軟,IBM,SUN等軟體巨頭。它制定和維護了HTML,XHTML,HTTP,XML,VML,XPath,XForm等軟體行業內重要的標準,絕大多數軟體廠商都支援W3C制定的標準,它制定的標準是真正的跨平台的全球通用的。因此它對全球軟體業界,尤其是WEB軟體業界有著巨大的影響。它的網址是 http://www.w3c.org/,在它的網站上可以看到它所制定的上百個標準。大家若要開發具有國際水平的WEB應用系統,應當要好好學習W3C的某些標準。

國際標準的意義

在這裡說明一下國際標準的意義。

    所謂國際標準就是某個權威的非營利性的國際組織,其立場中立,不代表某個具體的公司,而是代表整個業界。它針對某項普遍使用的技術出台一些規範和標準。而各個具體的軟體廠商在運用這項技術時自覺遵守這套國際標準。這樣能方便各個系統之間交流資料,保障異構系統進行整合,並保持資料結構的長期穩定性和相容性。這樣的國際組織有ISO,ECMA和W3C等等。

    我們使用到的一些技術都已經成為國際標準,例如SQL,JavaScript,C#,HTML,XML,XSLT,HTTP等很多技術。

    國際標準具有一些特點,首先是穩定性和連貫性,國際標準一旦正式發布,就保持了相當的穩定性,其內容只能謹慎的增加而不能刪減,國際標準組織不會輕易修改已經正式發布的國際標準,而且在修改標準時會充分考慮到各種因素,保證向上和向下的相容性,能最大程度的保障業界在舊標準上的投資。而且這些國際組織發布國際標準時有時會事先提出標準的修訂計劃。

    其次國際標準是全球業界都遵守的,雖然沒有強制遵守的機制,但絕大多數軟體廠商都會遵守或者努力遵守這些國際標準。而且國際標準組織的成員有很多大軟體廠商,比如W3C的成員就有微軟,IBM,SUN等大公司。因此國際標準是代表了最廣大軟體業界的根本利益,代表了最先進的軟體生產力。

    對於應用軟體開發商,充分的運用國際標準能很大程度的保護客戶在IT系統上的投資。由於國際標準具有相當的穩定性和連貫性,若客戶IT系統充分的使用了這些國際標準,則在升級到新標準時能獲得很好的相容性。IT系統不用推倒重來,這樣能保護客戶在已有系統上的投資。

    作為軟體開發人員,也應當瞭解這些國際標準,首先是能比較容易的實現異構系統的整合,並能獲得比較好的系統相容性和可維護性。而且軟體開發人員在切換開發平台,比如從Java轉移到.NET平台上時,以前學習國際標準的投資就會得到保護,而遵守相同標準的原始碼的移植和翻譯也是低成本的。

DOT.NET架構對XML的支援

    .NET架構提供了對XML的強大支援,而且.NET架構本身也普遍採用XML格式來儲存各種配置資訊。比如web.config檔案。

    在.NET類庫中,名稱空間System.Xml下面就包含了大量的操作XML文檔的類型。這些類型構成了兩種XML文檔的處理模型。

串流模型

    在串流模型中,我們將XML文檔做作一個資料流來進行處理,我們將逐個處理XML文檔中的資料,在這種模型下,我們可以唯讀快速讀取大體積的XML文檔,而且記憶體佔用少,程式效能好。類型System.Xml.XmlReader就提供了串流模型,使用XmlReader就可以快速讀取XML文檔。

    使用串流模型是有缺點的,首先是它只能讀取XML文檔,不能修改XML文檔;其次是檢索XML文檔內容不方便,不能使用XPath技術;而且編程介面比較簡單,處理XML文檔不夠方便。當程式需要比較簡單的從XML文檔讀取資料則可以採用串流模型。

DOM處理模型

    在DOM處理模型中,我們首先是使用文件物件模型的思想解析整個XML文檔,在記憶體中產生一個對象樹來表述XML文檔。比如使用一個XmlElement對象來影射到XML文檔中的一個元素,使用XmlAttribute對象來影射到XML文檔中的一個屬性。這樣我們編程操作記憶體中的對象就影射為操作XML文檔。

    使用DOM處理XML文檔具有相當大的優點,首先是處理方便,我們可以使用各種編程技巧來處理XML文檔對象樹狀結構,比如可以遞迴遍曆XML文檔的一部分或全部,可以向樹狀結構插入,修改或刪除XML元素,可以設定XML元素的屬性。

    在DOM模式下,我們可以使用XPath技術在XML文檔樹狀結構中進行快速檢索和定位,這為處理XML文檔帶來比較大的方便。

    在C#中,我們可以很簡單的使用DOM方式處理XML文檔。我們首先執行個體化一個System.Xml.XmlDocument類型,調用它的Load方法既可載入XML文檔並產生XML節點對象樹狀結構,然後我們就可以遍曆這個對象樹,新增修改和刪除節點,而且其中的任意一個節點都可以使用SelectNodes或SelectSingleNode方法通過XPath相對路徑快速尋找其它的節點。

    在名稱空間System.Xml下面大部分類型都是用來支援DOM處理模型的。其中很多類型配合起來共同組織成XMLDOM,XMLDOM是一種很典型的文件物件模型的應用。文件物件模型是一種比較進階的軟體設計模式,我會在今後的課程中詳細介紹文件物件模型這種軟體設計模式。

System.Xml名稱空間下的支援DOM的類型主要有

    XmlNode 是DOM結構中的所有類型的基礎類型,它定義了所有XML節點的通用屬性和方法,是XMLDOM的基礎。它具有一個ChildNodes屬性,表示它所包含的子XML節點。

    XmlAttribute 表示XML屬性,它只儲存在XmlElement的Attributes 列表中。

    XmlDocument表示XML文檔本身,是XMLDOM模型中的頂級對象,它用於對XML文檔進行整體的控制,並且是其它程式訪問XML文檔對象樹的唯一入口。

    XmlLinkedNode在XmlNode的基礎上實現了訪問前後同級節點的方法。

    XmlElement元素表示XML元素。是XMLDOM中使用最多的物件類型。它具有Attributes屬性可以處理它所擁有的屬性,可以使用ChildNodes屬性獲得它所有的子節點。並提供了一些添加和刪除子節點的方法。

    XmlCharacterData表示XML文檔中的字元資料的基礎類型。字元文本資料是分布在各個XMLElement之間的純文字資料。XmlAttribute中的文本資料是不屬於XML文字區塊的。

    XmlCDataSection 表示XML文檔中CData節,CData資料是採用”<![CDATA[     ]]>”包括起來的純文字資料。由於XML採用角括弧進行標記,因此具有和HTML類似的逸出字元,在一般的XML純文字段中若遇到角括弧等特殊字元時需要使用逸出字元,當文本段中包含大量的這類特殊字元時,手工書寫和察看XML文檔將比較困難,為了改善XML文檔的可讀性,在此可以使用CDATA節。在CDATA節中,所有的字元,包括特殊字元都不需要轉義,這樣察看和修改XML文檔都比較方便。

    XmlComment表示一段注釋,XML注釋和HTML注釋一樣,使用一對”<!--   -->”來包含起來。

    XmlText表示一段純文字資料。

    XmlWhitespace表示XML文檔中一段純粹由空白字元組成的文字區塊,空白字元包括空格,定位字元,換行和斷行符號符,全形空格不屬於空白字元。XmlDocument在解析XML文檔時會處理空白字元,當XmlDocument對象的PreserveWhiitespace屬性為true時,會為XML文檔中的純空白文字區塊產生XmlWhitespace對象,若該屬性為false時,則會忽略掉純空白文本,不會產生XmlWhitespace對象,好像原始的XML文檔中不存在這樣的空白文字區塊一樣。

其它處理模型

    除了串流模型和DOM處理模型外,還存在一些比較另類的使用比較少的處理模型,在此簡單介紹一下

DBDOM

    DBDOM是一種基於資料庫的XML文檔處理模型,它是一個開源項目。它採用大量的預存程序和資料庫操作,將一個個XML元素,XML屬性等資訊儲存到資料庫的欄位中。使用關係型資料庫來類比實現XML的樹狀結構。我對這個模型也不甚瞭解,只是知道大概的原理。

BinaryXML

    DOM方式處理XML文檔是需要消耗大量的記憶體的,在處理大型XML文檔時,DOM方式會比較大的影響應用系統的效能的。為此有人開始提出BinaryXML的處理模型。在這個模型中,XML文檔是當作位元據載入到記憶體中,然後解析文檔,使用大量的指標來指向XML文檔中的關鍵位置,通過指標可以快速定位XML文檔,能修改XML文檔,並能提供類似DOM的編程介面。這種方式能大大節省記憶體,所消耗的記憶體僅比XML檔案大小稍微大些。但實際運行效果我也不清楚。

XML對WEB開發的意義

    XML技術對WEB開發具有重大意義。若要開發高水平的WEB系統,應當好好使用XML技術。

XML和HTML

    XML和HTML都源自SGML,具有相同的來源,而且兩者都是採用角括弧的標記語言,兩者具有很大的相似性。使用XML完全可以類比出HTML,而且W3C提出了現代WEB網站應當採用的XHTML標準就是XML和HTML的結合。

    在使用ASP.NET開發WEB系統中,除了使用ASP.NET控制項展示資料外,還需要由程式拼湊出大量的HTML代碼來展現資料。簡單的進行字串串連操作來產生HTML頁面不是一種可持久性的軟體開發和維護的過程。程式碼很容易雜亂無章,產生的HTML代碼可讀性不好。若在產生HTML代碼的過程借鑒XML技術則有助於改善這種問題,從而能更好的控制WEB軟體的開發過程,提高軟體品質。

XML和WebService

    WebService基礎就是XML,WebService的原理是將編程對象序列化成一個XML文檔,然後通過HTTP協議傳遞給用戶端,用戶端接受這個XML文檔,通過還原序列化重現編程對象。因此WebService的基礎就是XML序列化技術。在開發和調試稍微複雜的WebService是需要一定的XML技術基礎。

Ajax技術的底層也是使用XML來傳遞資料的,可以看作一種特殊的WebService。可以這樣比喻,WebService是WEB系統的公開方法,而Ajax則是私人方法。

XML/XSLT提供一種全新的開發模式

    XML/XSLT兩項技術的配合可以提供一種全新的WEB系統開發模式。在這種模式下,頁面將需要顯示的純粹的資料群組織產生一個XML文檔,並配上XSL轉換資訊頭,然後發送到用戶端,在用戶端IE瀏覽器接受解析XML文檔,根據其中的XSL轉換頭資訊再下載XSLT文檔,執行XSLT轉換,然後才顯示轉換的結果。此時WEB頁面既能正常的使用指定的格式顯示資料,而且本身就是一個可供其它程式調用的WebService。該頁面的輸出的原始碼就是XML文檔,而且只有IE等瀏覽器類型軟體才處理XSLT轉換資訊頭,其他程式是會忽略掉這個資訊的。此時頁面具有雙重功能,便於代碼的整合開發和維護。

關於XSLT下節課程將詳細介紹。

使用C#輸出XML

    接下來我們將使用C#進行實際的XML開發,由於XML技術對WEB開發特別有用,因此將使用ASP.NET來示範使用C#進行XML開發。此處示範程式已經寫好,現在對程式碼進行詳細說明。

    本程式是一個ASP.NET程式,大家獲得程式碼後要在IIS中設定虛擬目錄,由於程式還需要訪問程式目錄下的一些檔案,因此還需要進行一些許可權的配置。程式目錄下的 demomdb.mdb 是程式使用的資料庫檔案。

    網站配置完畢後,我們在瀏覽器中輸入網站的地址即可開啟它的預設頁面。可以看到預設頁面上有些程式內容的簡單說明。

    首先我們看看 recordxml.aspx 頁面,我們看看 recordxml.aspx 的 HTML頁面代碼,可以看到該頁面HTML代碼很簡單,只有一行。因此該頁面的所有內容都是用C#代碼產生的。

我們切換到該頁面的C#代碼,可以看到在 Page_Load 函數裡面添加了代碼輸出頁面內容。代碼內容為

// 此處使用 XmlTextWriter 來快速輸出XML文檔內容.不構造XML文檔對象結構
this.Response.ContentEncoding = System.Text.Encoding.GetEncoding( 936 );
this.Response.ContentType = "text/xml";
// 串連資料庫
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();
// 查詢資料庫
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 );
        }
// 產生一個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 ++ )
            {
// 輸出一個欄位值
                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 函數的執行流程為

設定HTTP輸出類型

    首先設定HTTP的輸出類型,我們設定輸出的編碼格式為 GB2312,此處使用 GetEncoding(936 ) 就是獲得GB2312的編碼格式。

    我們還設定 ContentType 來設定文檔的輸出格式。大家若瞭解一些HTTP傳輸協議的都知道,ContentType屬性描述了文檔輸出類型,當文檔傳遞到用戶端時,用戶端瀏覽器獲得ContentType屬性值,查詢註冊表和Windows中註冊的COM資訊,獲得該屬性值確定的檔案類型,然後使用相應的模式顯示文檔。比如若設定ContentType屬性為application/vnd.ms-excel ,則用戶端瀏覽器查詢註冊表得知對應的檔案類型資訊在註冊項目 HKEY_CLASS_ROOT\.xls下面,本地檔案類型為”Excel.Sheet.8”,然後又根據其他資訊轉而調用EXCEL的COM組件來顯示獲得的HTTP文檔。

    從ContentType屬性的說明我們可以瞭解,很深入的掌握WEB開發,有時候是需要瞭解一些Windows編程的知識,因為B/S系統的用戶端,也就是各種瀏覽器,特別是IE瀏覽器就是比較複雜的Windows程式。

查詢資料庫

    設定了HTTP文檔輸出模式後,我們開始輸出XML文檔內容,首先是串連資料庫,使用了程式目錄下的demomdb.mdb資料庫,執行一個SQL查詢,獲得一個資料讀取器reader。

使用XmlTextWriter輸出XML文檔

    查詢得到資料後,我們就可以遍曆查詢所得的資料庫記錄,開始輸出XML文檔,此處我們使用XmlTextWriter輸出文檔。

    輸出XML文檔我們有兩種方式,一種是使用XmlTextWriter輸出,另外一種是從XmlDocument類型開始構造XML文檔對象結構,然後使用XmlDocument的Save方法輸出XML文檔。兩種方法有各自特點。

    使用XmlTextWriter是唯寫的向前的快速輸出XML文檔,而且輸出時不能訪問已經輸出的XML文檔內容,不能修改已經產生的XML文檔。這種方法速度快,佔用記憶體少,但不夠靈活。

    而使用XmlDocument類型構造XML文檔結構後再輸出XML文檔的方法比較靈活,我們可以隨時訪問和修改已經輸出的Xml文檔。這種方法速度慢,佔用記憶體多,但很靈活。

    在這裡我們要嘗試使用XmlTextWriter來輸出XML文檔,在另外的一個頁碼使用XmlDocument輸出XML文檔。

    我們首先在頁面輸出資料流上建立一個XmlTextWriter對象,設定它啟動縮排。它的Indentation,IndentChar和Formating就是控制縮排樣式,具體說明可以查看MSDN。XML文檔縮排是為了改善XML文檔的可讀性,有縮排的XML文檔便於人們直接閱讀和修改,但對應用程式來說,XML文檔是否有縮排是沒差別的。

    XmlTextWriter是一個基於其他流的針對輸出XML文檔的封裝,它本身不能開啟檔案,因此在初始化XmlTextWriter時必須指明底層的輸出對象,輸出對象可以為流或者文本書寫器。理論上我們可以使用字串拼湊來產生XML文檔,但實際開發中使用字串拼湊XML文檔不是明智之舉,建議使用XmlTextWriter。

    我們在web開發中有時會使用字串拼湊來產生HTML文檔,由於HTML文檔沒有很嚴格的文法限制,IE瀏覽器能解釋劣質的HTML代碼,因此有時會有開發人員這樣字串拼湊HTML文檔,但這會導致代碼比較雜亂,可讀性不好。而XML文檔具有很嚴格的語法檢查,只要一個XML語法錯誤就會導致整個XML文檔解析錯誤,因此我們應當使用XmlTextWriter,因此它能協助我們檢查基本的XML文法,確保我們能輸出合格的XML文檔。

    我們調用WriteStartDocument來開始輸出XML文檔,XmlTextWriter提供了很多配對使用的成員,使用一個方法後需要使用另外一個配對的方法。比如WriteStartDocument和WriteEndDocument配對,WriteStartElement和WriteEndElement配對,配對的方法必須成對調用。此處我們使用WriteStartDocument開始書寫Xml文檔,我們就必須使用WriteEndDocument 來完成輸出XML文檔的。而且在使用XmlTextWriter輸出XML文檔的時候,WriteStartDocument必須是第一個調用的方法。

    然後我們使用一個名稱為xsl的頁面參數來輸出XML文檔的xml-stylesheet資訊頭,關於XSL下節課將詳細介紹,在本節課不管這個參數。

    我們調用WriteStartElement 方法來輸出XML文檔的根節點,這裡參數為字串 “Table” , 則表示輸出的XML文檔的根節點名稱為Table。

    然後我們使用資料庫資料讀取器的Read函數來遍曆所有的查詢的資料,對於每一條記錄,使用XML書寫器的WriteStartElement方法來輸出XML元素,這裡參數為字串”Record”,表示輸出的XML元素名為Record,而且這個節點添加到XML文檔的根節點下。

    對於每一條記錄我們還遍曆其所有的欄位值,對每一個欄位值使用WriteStartElement新增一個XML元素,元素名稱就是各個欄位的名稱。若欄位值是空則使用WriteAttributeString輸出名為Null 的XML屬性,否則使用WriteString來輸出欄位值的字串表達值。

    由於WriteStartElement和WriteEndElement配對使用,因此每輸出完一個XML元素後需要調用WriteEndElement來結束輸出XML元素。當所有的內容輸出完畢後我們調用WriteEndDocument來結束輸出整個XML文檔的。

使用XmlDocument輸出XML文檔

    頁面record.aspx功能和recordxml.aspx類似。但它使用 XmlDocument來構造XML文檔對象結構,然後輸出XML文檔。現對其過程進行說明。

    開啟record.aspx的HTML代碼,可以看到代碼非常簡單,只有一行,所有的頁面輸出都在程式碼中實現。開啟它的C#代碼,可以看到在Page_Load 方法中添加了代碼執行頁面輸出,其代碼為

// 此處代碼動態構造 XmlDocument對象 來輸出XML文檔
System.Xml.XmlDocument XmlDoc = new System.Xml.XmlDocument();
XmlDoc.AppendChild( XmlDoc.CreateElement("Table"));
// 串連資料庫
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();
// 查詢資料庫
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 ++ )
            {
// 輸出一個欄位值
                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 )
{
// 根據頁面參數指定的XSLT樣式表名稱執行XSLT轉換
    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 );
}

    現對該方法的執行過程進行說明。

    首先是建立一個XmlDocument對象,XmlDocument建立時是一個空的XML文檔,沒有任何內容,沒有根項目,因此第一步就是使用文檔對象的AppendChild方法來添加根項目。在這裡我們使用了文檔對象的CreateElement函數來建立一個名為Table的XMLElement元素對象。

    各種類型的XML文檔對象,包括元素,屬性,文字區塊,注釋等等,都不能直接執行個體化,只能使用XmlDocument的一系列以Create開頭的函數來建立對象執行個體。建立的XML文檔對象是一個個離散的對象,必須及時的添加到XML文檔對象結構中才能真正成為XML文檔的一部分。一般的使用XML文檔對象或元素對象的AppendChild方法將新建立的XML文檔對象添加到指定對象下面,如此才加入了XML文檔結構的大家庭中。

    這種處理模式類似向DataTable添加新的資料行。DataRow本身不能直接執行個體化,我們首先得使用DataTable 的NewRow建立一個新的DataRow,然後使用DataTable的Rows屬性的Add方法向資料表添加剛剛建立的資料行。

    初始化一個XML文檔對象後,我們串連資料庫,查詢資料庫獲得一個資料讀取器,然後遍曆查詢所得的資料庫記錄,輸出XML文檔。

    對每一個資料庫記錄,首先建立一個RecordElement對象,添加到XML文檔的根節點下,然後遍曆資料庫記錄的每一個欄位值,建立一個FieldElement對象並添加到RecordElement下面,若當前資料庫欄位值為空白,則調用FieldElement的SetAttribute 方法,設定名為Null的屬性值為1,否則向FieldElement添加一個XML文本節點。

    完成組建XML文檔後,我們就向頁面輸出XML文檔的內容,若頁面參數中指定了XSLT轉換文檔名稱則執行XSLT轉換,並輸出轉換結果。關於XSLT下節課程將詳細說明。

    若未指明XSLT轉換資訊,則輸出XML文檔根節點的外圍XML字串。

    每一個XML文檔對象都具有InnerXml屬性和OuterXml屬性,這兩個屬性都直接返回表示該XML文檔片斷的不帶縮排的XML字串,但兩者有差別。InnerXml返回表示該節點所有子孫節點的XML字串。而OuterXml返回表示該節點本身和所有子孫節點的XML字串。例如對於XML文檔”<a><b />123</a>”,則它的根節點的InnerXml就是”<b />123”,而它的根節點的OuterXml就是”<a><b />123</a>”。注意這個字串是不帶縮排的。而XML文檔直接儲存到指定名稱的檔案中是帶縮排的。

    在IE瀏覽器中查看該頁面,可以看到IE只是顯示XML文檔中的純文字內容,並不像顯示其他XML文檔時的那種帶縮排的顯示。這是因為該ASPX的代碼中沒有設定ContentType為XML格式,而是使用預設的HTML格式,因此IE瀏覽器接受該頁面文檔代碼,並把它當作HTML進行解析和顯示,由於Table,Record等XML名稱都不是HTML標籤,因此IE瀏覽器忽略掉這些XML標記,只顯示出其中的純文字內容。但你查看該頁面的原始碼,可以看出該文檔的內容仍然是標準的XML格式,這裡的原始碼沒有縮排處理。

小結

    在本課程中,我們簡單介紹了XML的基本文法,說明了處理XML文檔的串流模式和DOM處理模式。還使用C#示範了輸出XML文檔。

    XML是一項不簡單的技術,而且在其上面派生了很多其他的技術,作為當代的軟體開發人員,尤其是WEB開發人員,應當熟練掌握和使用XML技術及其某些派生技術,熟悉XML技術有助於開發人員長期保持相當水平的軟體開發能力,也是學習其他先進生產力的重要基礎。大家應當好好學習XML技術。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.