首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 發現之旅 (一):XML 開發完整指南 - DOM、XPath、XSLT 與 ASP.NET 整合

     編輯:關於C#

課程簡介

本系列「C# 發現之旅」聚焦 C# 在 Web 資料庫開發**以外**的應用領域。首講介紹 **System.Xml 命名空間**核心類別,涵蓋 XML 基礎、DOM 處理模型、XPath 查詢、XSLT 轉換,並以 ASP.NET 實戰示範動態產生/轉換 XML。

XML 基礎回顧

  • 全名:Extensible Markup Language (可擴展標記語言)
  • 來源:源自 SGML (HTML 亦源自 SGML),XML 以 SGML 20% 語法實現 80% 功能。
  • 核心規範:
    1. 單一根元素
    2. 標籤正確巢狀 (不可交錯)
    3. 屬性值必須加引號
    4. 實體編碼 (< > & " ')
  • 優勢:跨平台、純文字、人機可讀、國際標準 (W3C)。
  • 劣勢:冗長、檔案大、不適合大量資料長期儲存/高頻傳輸。

.NET XML 處理兩大模型

模型核心類別特點適用場景
流式 (Streaming)XmlReader / XmlWriter唯讀/唯寫、前向、低記憶體、高效能、不支援 XPath/修改大型 XML 讀取、日誌串流、單向轉換
DOM (Document Object Model)XmlDocument, XmlElement, XmlNode...整份文件載入記憶體樹狀結構、支援 XPath、隨機存取、修改/新增/刪除節點中小型 XML、需複雜查詢/修改、XSLT 轉換

DOM 核心類別速查

  • XmlNode:所有節點基類,含 ChildNodes、ParentNode、SelectNodes (XPath)
  • XmlElement:元素節點,最常用,含 Attributes、SetAttribute、AppendChild
  • XmlAttribute:屬性節點,僅存在於元素的 Attributes 集合
  • XmlDocument:文件頂層入口,Load/Save/CreateElement/CreateTextNode...
  • XmlText / XmlCDataSection / XmlComment / XmlWhitespace:文字內容細分

實戰:ASP.NET 動態輸出 XML (兩種寫法)

場景

從 Access 資料庫 (demomdb.mdb) 讀取 Customers 資料表,輸出 XML,可選擇性套用 XSLT 樣式表。

寫法 A:XmlTextWriter (流式、高效能、唯寫)


// 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();
            }
        }
    }
}

寫法 B:XmlDocument (DOM、靈活、可修改/查詢)


// 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); // 無縮排
    }
}

關鍵差異比較

特性XmlTextWriterXmlDocument
記憶體低 (串流)高 (整份樹)
可修改已寫入內容否是
XPath 查詢不支援支援 (SelectNodes)
XSLT 轉換需先存檔/轉字串直接 XslTransform.Transform(doc...)
輸出格式控制Formatting/IndentationSave 才有縮排,OuterXml 無縮排

XSLT 簡介 (下講詳細)

XSLT (Extensible Stylesheet Language Transformations) 是 XML 轉換標準語言。瀏覽器端支援:IE/Edge/MSXML 可直接處理 `` 處理指令,自動下載 .xsl 檔並轉換顯示。**伺服器端轉換**則用 XslTransform (舊) 或 XslCompiledTransform (新,效能更好)。

XML 在 Web 開發的三大角色

  1. 資料交換格式:Web Services (SOAP)、AJAX 回傳、設定檔 (web.config)。
  2. 呈現分離:純 XML 資料 + XSLT 樣式表 = 多通道輸出 (HTML/PDF/Excel/行動裝置)。
  3. 程式碼產生器輸入:CodeSmith、T4 範本讀取 XML 中繼資料產生 DAL/BLL 程式碼。

最佳實踐提醒

  • ✅ 大檔 (>10MB) 必用 XmlReader/XmlWriter。
  • ✅ 需 XPath/修改/轉換才用 XmlDocument / XDocument (LINQ to XML)。
  • ✅ 輸出 XML 至 HTTP 回應**務必設定 ContentType = "text/xml"**,否則 IE 會當 HTML 解析只顯示文字。
  • ✅ 編碼一致性:資料庫、XML 宣告、HTTP Header、儲存檔案全統一 (建議 UTF-8)。
  • ✅ 新專案優先使用 System.Xml.Linq (XDocument, XElement):API 更現代、支援 LINQ 查詢、建構更直觀。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved