本系列「C# 發現之旅」聚焦 C# 在 Web 資料庫開發**以外**的應用領域。首講介紹 **System.Xml 命名空間**核心類別,涵蓋 XML 基礎、DOM 處理模型、XPath 查詢、XSLT 轉換,並以 ASP.NET 實戰示範動態產生/轉換 XML。
| 模型 | 核心類別 | 特點 | 適用場景 |
|---|---|---|---|
| 流式 (Streaming) | XmlReader / XmlWriter | 唯讀/唯寫、前向、低記憶體、高效能、不支援 XPath/修改 | 大型 XML 讀取、日誌串流、單向轉換 |
| DOM (Document Object Model) | XmlDocument, XmlElement, XmlNode... | 整份文件載入記憶體樹狀結構、支援 XPath、隨機存取、修改/新增/刪除節點 | 中小型 XML、需複雜查詢/修改、XSLT 轉換 |
XmlNode:所有節點基類,含 ChildNodes、ParentNode、SelectNodes (XPath)XmlElement:元素節點,最常用,含 Attributes、SetAttribute、AppendChildXmlAttribute:屬性節點,僅存在於元素的 Attributes 集合XmlDocument:文件頂層入口,Load/Save/CreateElement/CreateTextNode...XmlText / XmlCDataSection / XmlComment / XmlWhitespace:文字內容細分從 Access 資料庫 (demomdb.mdb) 讀取 Customers 資料表,輸出 XML,可選擇性套用 XSLT 樣式表。
// recordxml.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
Response.ContentEncoding = Encoding.GetEncoding(936); // GB2312
Response.ContentType = "text/xml"; // 關鍵:讓瀏覽器以 XML 檢視器顯示
using (var conn = new OleDbConnection($@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={Server.MapPath("demomdb.mdb")}"))
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT * FROM Customers";
conn.Open();
using (var reader = cmd.ExecuteReader())
{
string[] fields = new string[reader.FieldCount];
for (int i = 0; i < fields.Length; i++) fields[i] = reader.GetName(i);
using (var xw = new XmlTextWriter(Response.Output) { Formatting = Formatting.Indented, Indentation = 3, IndentChar = ' ' })
{
xw.WriteStartDocument();
// 可選 XSLT 樣式表
string xsl = Request.QueryString["xsl"];
if (!string.IsNullOrEmpty(xsl))
xw.WriteProcessingInstruction("xml-stylesheet", $"type='text/xsl' href='{xsl}'");
xw.WriteStartElement("Table");
while (reader.Read())
{
xw.WriteStartElement("Record");
for (int i = 0; i < fields.Length; i++)
{
xw.WriteStartElement(fields[i]);
object val = reader.GetValue(i);
if (val == null || val == DBNull.Value)
xw.WriteAttributeString("Null", "1");
else
xw.WriteString(Convert.ToString(val));
xw.WriteEndElement();
}
xw.WriteEndElement(); // Record
}
xw.WriteEndElement(); // Table
xw.WriteEndDocument();
}
}
}
}
// record.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
var doc = new XmlDocument();
doc.AppendChild(doc.CreateElement("Table")); // 建立根元素
// ... 相同資料庫讀取邏輯 ...
while (reader.Read())
{
var rec = doc.CreateElement("Record");
doc.DocumentElement.AppendChild(rec);
for (int i = 0; i < fields.Length; i++)
{
var field = doc.CreateElement(fields[i]);
rec.AppendChild(field);
object val = reader.GetValue(i);
if (val == null || val == DBNull.Value)
field.SetAttribute("Null", "1");
else
field.AppendChild(doc.CreateTextNode(Convert.ToString(val)));
}
}
// 輸出或 XSLT 轉換
string xsl = Request.QueryString["xsl"];
if (!string.IsNullOrEmpty(xsl))
{
var transform = new XslTransform();
transform.Load(Server.MapPath(xsl));
transform.Transform(doc, null, Response.Output, null);
}
else
{
Response.Write(doc.DocumentElement.OuterXml); // 無縮排
}
}
| 特性 | XmlTextWriter | XmlDocument |
|---|---|---|
| 記憶體 | 低 (串流) | 高 (整份樹) |
| 可修改已寫入內容 | 否 | 是 |
| XPath 查詢 | 不支援 | 支援 (SelectNodes) |
| XSLT 轉換 | 需先存檔/轉字串 | 直接 XslTransform.Transform(doc...) |
| 輸出格式控制 | Formatting/Indentation | Save 才有縮排,OuterXml 無縮排 |
XSLT (Extensible Stylesheet Language Transformations) 是 XML 轉換標準語言。瀏覽器端支援:IE/Edge/MSXML 可直接處理 `XslTransform (舊) 或 XslCompiledTransform (新,效能更好)。
XmlReader/XmlWriter。XmlDocument / XDocument (LINQ to XML)。ContentType = "text/xml"**,否則 IE 會當 HTML 解析只顯示文字。System.Xml.Linq (XDocument, XElement):API 更現代、支援 LINQ 查詢、建構更直觀。