XML文件與實體類的互相轉換
阿新 • • 發佈:2017-10-24
title 讀寫xml文件 序列化 time inf scribe des bus ria
1. 通常程序的配置信息都保存在程序或者網站的專門的配置文件中(App.config/web.config)。但是現在為了演示XML序列化和反序列化,將配置信息保存在一個XML文件(config.xml)中,通過反序列化將配置信息讀取出來保存到一個單獨的類(Config.cs)中。這樣如果需要用到配置信息,沒必要每次都讀寫XML文件,只需要調用Config這個類就可以獲取對應節點的信息。
config.xml:
<?xml version="1.0" encoding="utf-8"?> <Config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" IsAuto="true">
<Description>定時掃描數據庫,通過客戶號和業務號讀取客戶信息</Description>
<CustomerInfos> <CustomerInfo> <CustomerId>0013</CustomerId> <BusinessId>03</BusinessId> </CustomerInfo> <CustomerInfo> <CustomerId>0022</CustomerId> <BusinessId>02</BusinessId> </CustomerInfo> </CustomerInfos>
<ScanConfigs> <BeginTime>22:00:00</BeginTime> <EndTimme>23:00:00</EndTimme> </ScanConfigs>
</Config>
2. 為了將上面這個XML轉換為想要的實體類對象,方便在程序裏面讀取節點數據,需要創建一個相對應的實體類,在實體類中用[XmlRoot][XmlElement][XmlAttribute]等屬性標識。
Config.cs:
//XmlRoot表明這個類對應的是XML文件中的根節點
[XmlRoot(ElementName="Config")] public class Config {
//XmlElement表明這個字段對應的是XML文件中當前父節點下面的一個子節點
//ElementName就是XML裏面顯示的當前節點名稱
//類中的字段名稱與對應的XML節點的名稱可以不同(比如在這裏類Config中的屬性ClientDescription對應XML文件中根節點Config下面的子節點Description) [XmlElement(ElementName = "Description")] public string ClientDescription { get; set; }
//XmlAttribute表明這個字段是XML文件中當前節點的一個屬性 [XmlAttribute(AttributeName="IsAuto")] public string IsAuto { get; set; } [XmlElement(ElementName = "CustomerInfos")] public CustomerInfos CustomerInfos { get; set; } [XmlElement(ElementName = "ScanConfigs")] public ScanConfigs ScanConfigs { get; set; } } public class CustomerInfos{ [XmlElement(ElementName = "CustomerInfo")] public CustomerInfo[] cs { get; set; } } public class CustomerInfo { [XmlElement(ElementName = "CustomerId")] public string CustomerId { get; set; } [XmlElement(ElementName = "BusinessId")] public string BusinessId { get; set; } } public class ScanConfigs { [XmlElement(ElementName = "BeginTime")] public string BeginTime { get; set; } [XmlElement(ElementName = "EndTimme")] public string EndTimme { get; set; } }
3. 下面的代碼調用.net的XmlSerializer類的方法進行XML的反序列化
public class XmlUtil { //反序列化
//接收2個參數:xmlFilePath(需要反序列化的XML文件的絕對路徑),type(反序列化XML為哪種對象類型) public static object DeserializeFromXml(string xmlFilePath, Type type) { object result = null; if (File.Exists(xmlFilePath)) { using (StreamReader reader = new StreamReader(xmlFilePath)) { XmlSerializer xs = new XmlSerializer(type); result = xs.Deserialize(reader); } } return result; } }
4. 反序列化
string xmlPath = "d:\\config.xml"; Config c = XmlUtil.DeserializeFromXml(xmlPath, typeof(Config)) as Config;
二. 序列化
1. 反過來的,也可以將Config類的一個對象序列化為XML文件.下面的代碼通過調用.net的XmlSerializer類的方法將對象序列化為XML文件
public class XmlUtil { //序列化
//接收4個參數:srcObject(對象的實例),type(對象類型),xmlFilePath(序列化之後的xml文件的絕對路徑),xmlRootName(xml文件中根節點名稱)
//當需要將多個對象實例序列化到同一個XML文件中的時候,xmlRootName就是所有對象共同的根節點名稱,如果不指定,.net會默認給一個名稱(ArrayOf+實體類名稱) public static void SerializeToXml(object srcObject, Type type,string xmlFilePath, string xmlRootName) { if (srcObject != null && !string.IsNullOrEmpty(xmlFilePath)) { type = type != null ? type : srcObject.GetType(); using(StreamWriter sw=new StreamWriter(xmlFilePath)) { XmlSerializer xs = string.IsNullOrEmpty(xmlRootName) ? new XmlSerializer(type) : new XmlSerializer(type, new XmlRootAttribute(xmlRootName)); xs.Serialize(sw, srcObject); } } } }
2. 序列化
Config config = new Config(); config.ClientDescribe = "定時掃描數據庫,通過客戶號和業務號讀取客戶信息."; config.IsAuto = "true"; CustomerInfo ci1 = new CustomerInfo(); ci1.CustomerId = "0013"; ci1.BusinessId = "03"; CustomerInfo ci2 = new CustomerInfo(); ci2.CustomerId = "0022"; ci2.BusinessId = "02"; CustomerInfos cis = new CustomerInfos(); cis.cs = new CustomerInfo[] { ci1, ci2 }; config.CustomerInfos = cis; ScanConfigs sc = new ScanConfigs(); sc.BeginTime = "22:00:00"; sc.EndTimme = "23:00:00"; config.ScanConfigs = sc; XmlUtil.SerializeToXml(config, config.GetType(), "d:\\config.xml", null);
XML文件與實體類的互相轉換