XML 是資料交換、設定檔、文件儲存的通用格式。.NET 提供 System.Xml 命名空間下豐富的類別操作 XML。本文示範兩種建立 XML 的方式 (DOM 逐節點建構 vs LoadXml 字串載入) 以及使用 XmlNodeReader 讀取並繫結到 ListView 的完整範例。
using System.Xml;
public void CreateXmlDom(string filePath)
{
var doc = new XmlDocument();
// 1. XML 宣告
var decl = doc.CreateXmlDeclaration("1.0", "utf-8", null);
doc.AppendChild(decl);
// 2. 根元素
var root = doc.CreateElement("ROOT");
root.AppendChild(doc.CreateTextNode("Root Text"));
doc.AppendChild(root);
// 3. 子元素
var elem = doc.CreateElement("SampleElement");
elem.AppendChild(doc.CreateTextNode("The text of the sample element"));
root.AppendChild(elem); // 掛在根元素下
// 4. 存檔
doc.Save(filePath);
}
public void CreateXmlLoadXml(string filePath)
{
var doc = new XmlDocument();
string xml = @"
The text of the sample element
";
doc.LoadXml(xml);
doc.Save(filePath);
}
範例 XML 結構 (data.xml):
Ma Jin Hu
239000
Feng Huang Street
Chu Zhou City
ANHUI
Wang Tian
239000
Lang Ya Street
He Fei City
ANHUI
using System;
using System.Windows.Forms;
using System.Xml;
public class Form1 : Form
{
private Button btnRead;
private ListView lvData;
public Form1()
{
InitializeComponent();
}
private void InitializeComponent()
{
btnRead = new Button { Text = "讀取 XML", Location = new System.Drawing.Point(240, 296), Size = new System.Drawing.Size(112, 37) };
btnRead.Click += BtnRead_Click;
lvData = new ListView
{
Location = new System.Drawing.Point(10, 9),
Size = new System.Drawing.Size(623, 269),
View = View.Details,
GridLines = true,
FullRowSelect = true
};
lvData.Columns.Add("Name", 120);
lvData.Columns.Add("Zip", 80);
lvData.Columns.Add("Address", 150);
lvData.Columns.Add("City", 120);
lvData.Columns.Add("State", 80);
this.Controls.Add(lvData);
this.Controls.Add(btnRead);
this.ClientSize = new System.Drawing.Size(650, 350);
this.Text = "C# 讀取 XML 範例";
}
private void BtnRead_Click(object sender, EventArgs e)
{
lvData.Items.Clear();
try
{
var doc = new XmlDocument();
doc.Load(@"C:\data.xml"); // 或 Application.StartupPath
using (var reader = new XmlNodeReader(doc))
{
string currentElement = "";
ListViewItem item = null;
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
currentElement = reader.Name;
if (currentElement == "Person")
item = new ListViewItem(); // 新建一列
break;
case XmlNodeType.Text:
if (item == null) break;
string value = reader.Value;
switch (currentElement)
{
case "Name": item.Text = value; break; // 第一欄用 Text
case "Zip": item.SubItems.Add(value); break;
case "Address": item.SubItems.Add(value); break;
case "City": item.SubItems.Add(value); break;
case "State":
item.SubItems.Add(value);
lvData.Items.Add(item); // 讀完 State 表示一筆 Person 結束
item = null;
break;
}
break;
}
}
}
}
catch (Exception ex)
{
MessageBox.Show($"讀取失敗: {ex.Message}", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
[STAThread]
static void Main() { Application.Run(new Form1()); }
}
System.Xml.Linq):XDocument/XElement API 更直觀、支援 LINQ 查詢、建構語法更簡潔 (建議新專案優先使用)。XmlSerializer, DataContractSerializer):物件 <-> XML 自動轉換,適合設定檔、DTO 傳輸。
var doc = XDocument.Load(@"C:\data.xml");
var persons = doc.Descendants("Person").Select(p => new
{
Name = (string)p.Element("Name"),
Zip = (string)p.Element("Zip"),
Address = (string)p.Element("Address"),
City = (string)p.Element("City"),
State = (string)p.Element("State")
}).ToList();
// 直接繫結到 ListView 或 GridView