專案常需讓使用者透過介面編輯 XML 設定檔。本文示範完整的 WinForms 解決方案:動態載入 XML 節點生成編輯介面、使用者修改後寫回 XML,採用 XmlDocument 操作,程式碼結構清晰,易於擴充。
<rss> 下含多個屬性式子節點在 Form 上放置:
Button btnLoad - 選擇 XML 檔案Button btnSave - 寫入修改Panel panel1 - 動態生成 Label + TextBox 配對OpenFileDialog - 篩選 *.xmlpublic class XMLConfig
{
public int Count { get; private set; }
public string Path { get; private set; }
private List<string> _names = new List<string>(); // 節點 Name 屬性
private List<string> _values = new List<string>(); // 節點 InnerText
public XMLConfig(string path) { LoadXml(path); }
private void LoadXml(string path) { ... }
public int GetCount() => Count;
public string GetName(int index) => _names[index];
public string GetValue(int index) => _values[index];
public void UpdateValue(int index, string newValue) => _values[index] = newValue;
public void SaveAll() { ... }
}
private void LoadXml(string path)
{
Path = path;
var doc = new XmlDocument();
doc.Load(path);
var root = doc.SelectSingleNode("rss");
foreach (XmlNode node in root.ChildNodes)
{
_names.Add(node.Attributes["Name"]?.Value ?? "");
_values.Add(node.InnerText);
}
Count = _names.Count;
}
public void SaveAll()
{
var doc = new XmlDocument();
doc.Load(Path);
var nodes = doc.SelectSingleNode("rss").ChildNodes;
for (int i = 0; i < nodes.Count; i++)
{
var elem = (XmlElement)nodes[i];
if (elem.Attributes["Name"]?.Value == _names[i])
elem.InnerText = _values[i];
}
doc.Save(Path);
}
private void btnLoad_Click(object sender, EventArgs e)
{
var ofd = new OpenFileDialog
{
InitialDirectory = Application.StartupPath,
Filter = "XML 檔案|*.xml",
RestoreDirectory = true
};
if (ofd.ShowDialog() != DialogResult.OK) return;
_xmlConfig = new XMLConfig(ofd.FileName);
panel1.Controls.Clear();
const int Y_SPACING = 30, X_LABEL = 3, LABEL_W = 60;
for (int i = 0; i < _xmlConfig.GetCount(); i++)
{
var lbl = new Label
{
Text = _xmlConfig.GetName(i),
Size = new Size(LABEL_W, 23),
AutoSize = false,
Location = new Point(X_LABEL, i * Y_SPACING)
};
var txt = new TextBox
{
Text = _xmlConfig.GetValue(i),
Tag = i, // 存索引供儲存時識別
Location = new Point(X_LABEL + LABEL_W + 10, i * Y_SPACING)
};
panel1.Controls.Add(lbl);
panel1.Controls.Add(txt);
}
}
private void btnSave_Click(object sender, EventArgs e)
{
foreach (Control ctrl in panel1.Controls)
{
if (ctrl is TextBox txt && txt.Tag != null)
{
int index = Convert.ToInt32(txt.Tag);
_xmlConfig.UpdateValue(index, txt.Text);
}
}
_xmlConfig.SaveAll();
MessageBox.Show("儲存完成");
}
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<Student Name="姓名">寧澤濤</Student>
<Age Name="年齡">22</Age>
<Hobby Name="愛好">游泳</Hobby>
</rss>
說明:每個子節點以 Name 屬性作為顯示標題,InnerText 為可編輯值。
XDocument (LINQ to XML) 簡化查詢與更新語法此範例展示了「資料層與 UI 層分離」的經典模式:XMLConfig 專注 XML 操作,Form 專注介面呈現與互動。動態生成控制項技巧配合 Tag 屬性索引,能靈活應對結構不固定的設定檔編輯需求。