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

C# 讀取網站 XML 資料並繫結至 DataGrid 完整範例

     編輯:關於C語言

前言

早期 .NET Framework 1.x/2.0 時代,常透過 XmlDocument 載入遠端 XML,再以 DataTable 做為 DataGrid 資料來源。本文整理一個完整的 Windows Forms 範例,示範從 URL 載入 XML、XPath 查詢節點、動態建立欄位並繫結顯示的完整流程。

完整程式碼架構

using System;
using System.Data;
using System.Xml;
using System.Windows.Forms;

namespace WebXmlReaderDemo
{
    public class MainForm : Form
    {
        private DataGrid dataGridVisitors;
        private Button btnLoadXml;

        public MainForm()
        {
            InitializeComponent();
        }

        private void InitializeComponent()
        {
            // DataGrid 設定
            dataGridVisitors = new DataGrid
            {
                CaptionText = "訪客清單",
                Location = new Point(8, 8),
                Size = new Size(552, 184),
                TabIndex = 0
            };
            dataGridVisitors.Navigate += DataGridVisitors_Navigate;

            // 按鈕設定
            btnLoadXml = new Button
            {
                Text = "載入 XML",
                Location = new Point(32, 240),
                Size = new Size(80, 24),
                TabIndex = 1
            };
            btnLoadXml.Click += BtnLoadXml_Click;

            // 表單設定
            ClientSize = new Size(568, 278);
            Controls.AddRange(new Control[] { dataGridVisitors, btnLoadXml });
            Text = "XML 資料讀取示範";
            Load += MainForm_Load;
        }

        private void BtnLoadXml_Click(object sender, EventArgs e)
        {
            try
            {
                // 1. 載入遠端 XML
                var xmlDoc = new XmlDocument();
                xmlDoc.Load("https://www.example.com/data.xml"); // 替換為實際 URL

                // 2. XPath 選取目標節點集合
                XmlNode root = xmlDoc.DocumentElement.SelectSingleNode("/JoySou");
                XmlNodeList visitors = root?.SelectNodes("Info/Visitors/Visitor");

                if (visitors == null || visitors.Count == 0)
                {
                    MessageBox.Show("找不到訪客資料");
                    return;
                }

                // 3. 建立 DataTable 結構
                var dt = new DataTable();
                dt.Columns.Add("Name", typeof(string));
                dt.Columns.Add("IP", typeof(string));
                dt.Columns.Add("Address", typeof(string));
                dt.Columns.Add("OS", typeof(string));
                dt.Columns.Add("Software", typeof(string));

                // 4. 逐筆解析屬性填入 DataTable
                foreach (XmlNode visitor in visitors)
                {
                    var attrs = visitor.Attributes;
                    dt.Rows.Add(
                        attrs["name"]?.Value ?? "",
                        attrs["ip"]?.Value ?? "",
                        attrs["address"]?.Value ?? "",
                        attrs["os"]?.Value ?? "",
                        attrs["soft"]?.Value ?? ""
                    );
                }

                // 5. 繫結至 DataGrid
                dataGridVisitors.DataSource = dt;
            }
            catch (Exception ex)
            {
                MessageBox.Show($"載入失敗:{ex.Message}", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void DataGridVisitors_Navigate(object sender, NavigateEventArgs ne) { }
        private void MainForm_Load(object sender, EventArgs e) { }

        [STAThread]
        static void Main() => Application.Run(new MainForm());
    }
}

關鍵技術點解析

1. XmlDocument.Load(string url)

直接支援 HTTP/HTTPS URL,內部會自動發送 GET 請求並解析回應流。注意:

  • 需確保目標伺服器回傳 Content-Type: text/xml 或 application/xml。
  • 大型 XML 檔案會佔用較多記憶體,考慮改用 XmlReader 串流式讀取。

2. XPath 查詢技巧

  • SelectSingleNode 取得單一節點(如根節點)。
  • SelectNodes 取得節點集合,支援完整 XPath 語法(如 //Visitor[@id='123'])。
  • 屬性存取:node.Attributes["attrName"]?.Value 安全取值。

3. DataTable 動態建構

依 XML 結構動態 Columns.Add,再以 Rows.Add 填入資料,最後指派給 DataGrid.DataSource 即可自動顯示。

現代化改良建議(.NET Core / .NET 5+)

  • 改用 HttpClient + XDocument.Load(await stream) 非同步載入。
  • 採用 System.Text.Json 或 XmlSerializer 直接反序列化為強型別集合 List<Visitor>。
  • UI 改用 DataGridView(WinForms)或 WPF DataGrid,支援排序、篩選、虛擬模式等進階功能。
  • 加入快取機制(MemoryCache)避免重複請求相同 XML。

常見問題 FAQ

Q: 執行時拋出「遠端伺服器傳回錯誤: (403) 禁止存取」?
A: 目標網站可能擋爬蟲,需在 XmlDocument 的 XmlUrlResolver 設定 Credentials 或自訂 User-Agent;更建議改用 HttpClient 完整控制 Header。
Q: XML 有命名空間怎麼查詢?
A: 建立 XmlNamespaceManager 註冊前綴,XPath 查詢時帶入 manager:SelectNodes("//ns:Visitor", nsmgr)。
Q: 資料量超過 1 萬筆 DataGrid 會卡頓?
A: 啟用虛擬模式(DataGridView.VirtualMode = true)或分頁載入,避免一次繫結大量資料。

總結

本範例展示了經典的「遠端 XML → XmlDocument → XPath → DataTable → DataGrid」資料流程。雖然現代開發傾向強型別反序列化與非同步模式,但理解此基礎流程有助於維護舊專案或快速原型開發。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved