然後我們使用一個名稱為 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 );
}