C# XML 輸出教學
XML 是其中一種主流的數據儲存格式之一, 在C# 中, 大概有3種不同的寫法把數據輸出成XML 文件。 在本文中, 我會利用一個簡單的Window form 程式介紹這3種不同的寫法。 以下是範例的XML 格式
<Im>
<Number>xx</Number>
<Name> xxx</Name>
<Type> xxx <Type>
<Data> xxx </Data>
</Im>
成功輸出的XML 文件 在Chrome 中顯示
Window form 程式
和方法1相比, 如遇到要處理圖片的情況下, 則只需把圖片的binary data 放到byte 類型的數組中, 再利用XmlTextWriter中的WriteBase64 方法便可。 不用自行轉換成base64字串。 但要留意的事是 由於是使用XmlTextWriter 是把text 以串流的型式輸出。 所以寫入資料流 時最好要按Xml結構的順序寫入。 因為在串流中append 結構是比較困難的事。
方法三
最後一種方法是使用XML.Serialization 空間下的方法, 個人比較推薦這種方法。 因為它是把XML 文件看成是物件來看待。 再使用Serialize寫入到XML文件。 如從XML 文件中拿回資料時, 只需利用Deserialize 方法便可以輕易地取值。 但在程式中結立的步驟比較上2種方法多一些。 但我認為前期的付出能使後期的工作更舒服。 特別是如果你的XML 結構會經常更改或在系統中多次出現的話。
先在專案中新增一個名為ImgXml 的類別, 然後 建立 name, type, number 和data 這4個attribute
並如上圖加入Xml 的Serialization tag 。 就這樣, 現在ImgXml 這個類別便能夠利用 XmlSerializer 這個類別進行Serialization。 生成自定的XML 了。 為了增加 代碼的重用性, 所以我直接在ImgXml 這個class 中加入toXmlDocument 的方法。 該方法返回一個XmlDocument 類別。
上述的程序代碼中
new XmlSerializer(typeof(ImgXml)) 是生成一個處理ImgXml類別的XmlSerializer。
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", ""); 是定義XML 文檔的命名空間。
serializer.Serialize(writer, this, ns) 便是把物件以XML 形式寫入XmlTextWriter 中。
以由於 XmlTextWriter 是 與MemoryStream 連接。 所以實則上是當XmlTextWriter 呼叫flush 方法後 ImgXml 類別便以XML 的格式寫到MemoryStream 中。
最後輸出XML 文件的程式碼如下。
以後只需簡單調用toXmlDocument 方法 便可生成 xml 格式。
Window form 程式
XML 輸出方法
方法一
首先要介紹的寫法是利用XMLElement 的操作, 在XmlDocument 中構建XML 節點。
上述程式碼先構建一個全新的XmlDocument, 然後逐一構建節點。 最後把構建的節點放到對應的節點或XML Root 節點下。 成功構建後便使用XmlDocument 中的save 方法輸出XML 文件。
以上要注意的事是使用這種方法生成XML 的話, 如遇到要處理圖片的情況。 請先把圖片轉換成base64 字串後, 再放到節點的inner Text 中。
方法二
第二種方法是利用XmlTextWriter 把xml node 按順序寫入Filestream 中。 最後輸出成XML 文件。 程序碼如下,和方法1相比, 如遇到要處理圖片的情況下, 則只需把圖片的binary data 放到byte 類型的數組中, 再利用XmlTextWriter中的WriteBase64 方法便可。 不用自行轉換成base64字串。 但要留意的事是 由於是使用XmlTextWriter 是把text 以串流的型式輸出。 所以寫入資料流 時最好要按Xml結構的順序寫入。 因為在串流中append 結構是比較困難的事。
方法三
最後一種方法是使用XML.Serialization 空間下的方法, 個人比較推薦這種方法。 因為它是把XML 文件看成是物件來看待。 再使用Serialize寫入到XML文件。 如從XML 文件中拿回資料時, 只需利用Deserialize 方法便可以輕易地取值。 但在程式中結立的步驟比較上2種方法多一些。 但我認為前期的付出能使後期的工作更舒服。 特別是如果你的XML 結構會經常更改或在系統中多次出現的話。
先在專案中新增一個名為ImgXml 的類別, 然後 建立 name, type, number 和data 這4個attribute
並如上圖加入Xml 的Serialization tag 。 就這樣, 現在ImgXml 這個類別便能夠利用 XmlSerializer 這個類別進行Serialization。 生成自定的XML 了。 為了增加 代碼的重用性, 所以我直接在ImgXml 這個class 中加入toXmlDocument 的方法。 該方法返回一個XmlDocument 類別。
上述的程序代碼中
new XmlSerializer(typeof(ImgXml)) 是生成一個處理ImgXml類別的XmlSerializer。
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", ""); 是定義XML 文檔的命名空間。
serializer.Serialize(writer, this, ns) 便是把物件以XML 形式寫入XmlTextWriter 中。
以由於 XmlTextWriter 是 與MemoryStream 連接。 所以實則上是當XmlTextWriter 呼叫flush 方法後 ImgXml 類別便以XML 的格式寫到MemoryStream 中。
最後輸出XML 文件的程式碼如下。
以後只需簡單調用toXmlDocument 方法 便可生成 xml 格式。
總結
本文介紹了三種不同的方法來生成XML 文件。 而三種方法中, 我比較喜歡使用Serialization 方式。 因為這種寫法比較簡結。重用性高及 寫法更符合物件導向編程(OOP) 的原則。
這個Window Form 的源代碼已放在 https://github.com/Isaac234517/XmlOutputTest_C-.git
希望大家喜歡。
留言
張貼留言