早期 .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());
}
}
直接支援 HTTP/HTTPS URL,內部會自動發送 GET 請求並解析回應流。注意:
Content-Type: text/xml 或 application/xml。XmlReader 串流式讀取。SelectSingleNode 取得單一節點(如根節點)。SelectNodes 取得節點集合,支援完整 XPath 語法(如 //Visitor[@id='123'])。node.Attributes["attrName"]?.Value 安全取值。依 XML 結構動態 Columns.Add,再以 Rows.Add 填入資料,最後指派給 DataGrid.DataSource 即可自動顯示。
HttpClient + XDocument.Load(await stream) 非同步載入。System.Text.Json 或 XmlSerializer 直接反序列化為強型別集合 List<Visitor>。DataGridView(WinForms)或 WPF DataGrid,支援排序、篩選、虛擬模式等進階功能。MemoryCache)避免重複請求相同 XML。XmlDocument 的 XmlUrlResolver 設定 Credentials 或自訂 User-Agent;更建議改用 HttpClient 完整控制 Header。XmlNamespaceManager 註冊前綴,XPath 查詢時帶入 manager:SelectNodes("//ns:Visitor", nsmgr)。DataGridView.VirtualMode = true)或分頁載入,避免一次繫結大量資料。本範例展示了經典的「遠端 XML → XmlDocument → XPath → DataTable → DataGrid」資料流程。雖然現代開發傾向強型別反序列化與非同步模式,但理解此基礎流程有助於維護舊專案或快速原型開發。