logo头像

Edward.K Thinking

C# 將XML檔案轉換成Class Model



在C#中把Json檔案格式轉換成強型別的物件,是很常使用的需求。不過,在於XML就相對比較少,通常作法或是透過一些套件去讀取XML內想要的資訊作為使用。但有時候是要把整個XML內的資料都再做二次應用或是儲存到資料庫中。這時候,把XML轉換成強型別物件後,再處理上就會比較方便。


一般XML格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8"?>
<Panel cModel="" LotNo="1" StationId="2" fdate="" CycleTime="13" Operator="" ConfirmTime="" Status="" Machine="" Carrier="NOREAD">
<Board imulti="5" TopBtm="T" BoardSN="" Status="">
<Component CompName="" TB="T" Type="" Status="" MachineDefect="" ConfirmDefect="" AI_result="">
<CompImage>
<Image PicPath="" X1="100" Y1="100" X2="762" Y2="12868" Camera="0" Angle="0"/>
</CompImage>
<Window Name="" Status="" MachineDefect="" ConfirmDefect="" WindowInfo=" ;0; ;" AI_result="" PicPath="" X1="540" Y1="4501" X2="620" Y2="4807" Camera="0" Angle="90"/>
</Component>
</Board>
.....
</Panel>

必須先把XML格式轉換成C#物件。作法只需要Copy整份XML檔案內容,然後到.CS檔案內貼上,只是貼上部分,要選擇Parse XML As Code,就會依照XML內的element自動建立好對應的物件和物件型別,這作法與把Json格式轉換成C#物件是相同作法。不過,在於變數型別部分,建議還是要自行再卻認一下,有時不會與實際相同。


貼上後的結果如下:


建立Model後,就是把檔案內容讀進來並且塞入到Model內,首先,必須先加入System.Xml.SerializationNamespace。然後,很簡單的使用Deserialize就可以了

1
2
3
4
5
XmlSerializer serializer = new XmlSerializer(typeof(Model.XML.Panel));
using (FileStream fs = new FileStream(filepath, FileMode.Open))
{
var result= (Model.XML.Panel)serializer.Deserialize(fs);
}

這樣就可以把XML內容轉換成C#的強型別物件了,再進階一點的,就是如果遇到XML格式有新增節點或是屬性,但是我們物件沒有加入,可以另外加入下面兩個判斷

1
2
3
4
5
6
7
8
9
10
11
12
13
private void serializer_UnknownNode
(object sender, XmlNodeEventArgs e)
{
Console.WriteLine("Unknown Node:" + e.Name + "\t" + e.Text);
}

private void serializer_UnknownAttribute
(object sender, XmlAttributeEventArgs e)
{
System.Xml.XmlAttribute attr = e.Attr;
Console.WriteLine("Unknown attribute " +
attr.Name + "='" + attr.Value + "'");
}

並修改原本讀XML功能的裡面Code

1
2
3
4
5
6
7
XmlSerializer serializer = new XmlSerializer(typeof(Model.XML.Panel));
serializer.UnknownNode += new XmlNodeEventHandler(serializer_UnknownNode);
serializer.UnknownAttribute += new XmlAttributeEventHandler(serializer_UnknownAttribute);
using (FileStream fs = new FileStream(filepath, FileMode.Open))
{
var result= (Model.XML.Panel)serializer.Deserialize(fs);
}

藉由以上簡單方式就可以將XML內容轉換成C#的強型別物件了,在C#內要處理相關資料也會簡單許多了

上一篇