1. 程式人生 > >XML文件與實體類的互相轉換

XML文件與實體類的互相轉換

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文件與實體類的互相轉換