在 .NET 開發中,C# XML 解析 是處理外部資料與系統整合的重要技術之一。無論是讀取設定檔、API 回傳資料,或與其他系統交換資料,XML 都是常見格式。本篇將詳細介紹如何使用 C# 讀取 XML 檔案與解析資料,包含節點存取、資料擷取,以及實務上常見的應用方式,讓你快速掌握 XML 檔案處理的核心技巧。
本篇重點:
- ✔ C# 讀取 XML 檔案教學
- ✔ XML 節點(Node)與屬性(Attribute)解析
- ✔ 使用 XmlDocument / XDocument 讀取資料
- ✔ 常見 XML 資料處理技巧
上次財務部門要我們解析txt檔案,財務部門說這是銀行端的紀錄,這次他們有了新的需求,需要記錄我們自己入帳的人員跟款項做對應,方便銷帳以及知道收的款項是否正確,款項缺失時才知道要找誰補回,有了上次的經驗這次就會更簡單,只是紀錄資訊的格式改成XML,但我們整個開發的過程不會改變,那就趕快開始開發工作吧!
這次的需求:
- XML檔案裏,USERID是公司的入帳人員,TA是入帳金額,PR1是客戶資訊。XML檔案會有多個,每個都是獨立的交易紀錄。
- 請依據每個XML的PR1客戶資訊加總入帳金額,將客戶、客戶加總入帳金額、入同客戶帳的公司人員,這三樣資訊顯示成一列資料,方便財務人員對帳。
銀行端寄來的XML格式範例如下:
<PRq>
<Pq>
<USERID>xxxxx</USERID>
<IDD>0</IDD>
<MsgDate>20230701</MsgDate>
<TDateNo>0000001</TDateNo>
<TDate>20230701</TDate>
<TTime>172400</TTime>
<ANo>xxxxx</ANo>
<AC>TWD</AC>
<Sign>+</Sign>
<TA>0000001500000</TA>
<Type>xxx</Type>
<PR1>xxxxx</PR1>
</Pq>
</PRq>
複製上方格式到記事本裡面,存成XML檔案,並且複製多個把TA(金額)、USEID(入帳人員)、PR1(客戶)改動一下,其它的值不用改動,讓接下來的程式有檔案可以測試邏輯是否正確。
我建議複製10個檔案改動如下:
<USERID>001</USERID><TA>0000001500000</TA><PR1>a01</PR1>
<USERID>002</USERID><TA>0000001000000</TA><PR1>a01</PR1>
<USERID>001</USERID><TA>0000001100000</TA><PR1>a01</PR1>
<USERID>001</USERID><TA>0000001200000</TA><PR1>a02</PR1>
<USERID>003</USERID><TA>0000001300000</TA><PR1>a02</PR1>
<USERID>004</USERID><TA>0000001400000</TA><PR1>a02</PR1>
<USERID>003</USERID><TA>0000001600000</TA><PR1>a03</PR1>
<USERID>002</USERID><TA>0000001700000</TA><PR1>a03</PR1>
<USERID>001</USERID><TA>0000001800000</TA><PR1>a03</PR1>
<USERID>004</USERID><TA>0000001900000</TA><PR1>a04</PR1>
專案開發
語言:asp.net c#
應用程式: windows forms
1 . 建立專案
打開Visual Studio 2022 建立一個asp.net c# windows forms專案,選Windows Forms App(.NET Framework),下一步後按建立。(圖一)
(圖一)

- 拉一個button在畫面上提供程式的進入點,以及DataGridView顯示資料。(圖二)
(圖二)

- 將拉出來的button1改按鈕本身的名稱,改為start。(圖三)(圖四)
左鍵點一下button1 -> 右邊就會顯示button1的屬性 -> 找到(Name)屬性 -> 修改為start
(圖三)

(圖四)

- 將button1改顯示名稱,改為開始。(圖五)(圖六)
左鍵點一下button1 -> 右邊就會顯示button1的屬性 -> 找到Text屬性 -> 修改為"開始"
(圖五)

(圖六)

- 對(圖六)"開始"按鈕點左鍵兩下,進入程式執行的區塊。(圖七)
因為我們改過名稱,現在程式區塊已經不叫button1_Click而是start_Click。
(圖七)

補充:
- 因為我們有基礎的程式能力了,元件的名稱我們都應該好好命名,不能再直接用預設名稱button1,要依據他的功能命名,因此這邊我們命名為start,這是軟體工程師都會共同遵守的準則。
- 按鈕顯示的名稱也要依據功能好好命名,我們這個按鈕就是開始去執行程式碼,所以我們顯示為"開始",假設今天有一個按鈕功能是暫停,就應該顯示為"暫停"。
- 屬性(Name)跟Text不同之處在於,(Name)是這個元件在程式碼呼叫時的名稱,Text則是在使用者介面顯示的名稱。
2 . 詢問ChatGPT
- 語言、框架、功能需求清楚的表達給GPT如下:
asp.net C# windowsform 我的XML格式如下,取得每一個Tag值,且有多個XML檔案,依據PR1裡面相同的值加總TA的值,以及把同PR1不同USERID的值串起來,顯示在dataGridView1。
(這裡要把txt的內容順便貼到ChatGPT,ChatGPT才能準確幫你分析)
- 取得GPT給的範例,並把範例程式碼放到我們start按下後會執行程式的區塊內,private void start_Click(object sender, EventArgs e)的大括號{}裡面。
(請先用我查到的範例,後續有一定的基礎後可以自己使用GPT查出的範例,以免初學階段看不懂GPT的範例導致學習成效不彰)
private void start_Click(object sender, EventArgs e)
{
string folderPath = @"C:\XMLFolder";
var files = Directory.GetFiles(folderPath, "*.xml");
var allData = files
.SelectMany(file => XDocument.Load(file)
.Descendants("Pq")
.Select(x => new
{
USERID = (string)x.Element("USERID"),
PR1 = (string)x.Element("PR1"),
TA = Convert.ToDecimal((string)x.Element("TA"))
})
)
.ToList();
var result = allData
.GroupBy(x => x.PR1)
.Select(g => new
{
PR1 = g.Key,
TotalTA = g.Sum(x => x.TA),
USERIDs = string.Join(",", g
.Select(x => x.USERID)
.Distinct())
})
.ToList();
DataTable dt = new DataTable();
dt.Columns.Add("PR1");
dt.Columns.Add("TotalTA");
dt.Columns.Add("USERIDs");
foreach (var item in result)
{
dt.Rows.Add(item.PR1, item.TotalTA, item.USERIDs);
}
dataGridView1.DataSource = dt;
}
3 . 測試效果
- 開始前要在 "C:\XMLFolder" 裡面存一開始我們複製並且有改動數值的xml檔才有辦法正常測試!(圖一)
(圖一)

- 執行程式並且按下"開始",結果就會顯示在畫面上!(圖二)
(圖二)

結論
這篇練習我們為自己開發的程式碼準備了10個測試的檔案,準備測試的資料或檔案也是開發程式相當重要的一個環節,因為在準備跟測試過程中會讓你更了解自己的程式。
在實務上我們每次開發完系統都要花蠻長的一段時間測試,這樣有Bug就能提前發現,使用者才能更順利使用。因此,寫程式碼很重要,但是測試程式的正確性也一樣重要!下一篇我們一樣一起來研究範例程式碼。













