zoukankan      html  css  js  c++  java
  • C#实现复杂XML的序列化与反序列化

    已知.xml(再此命名default.xml)文件,请将其反序列化到一个实例对象。

    Default.XML文件如下:

    <?xml version="1.0" encoding="utf-8"?>
    
    <config> 
      <rules> 
        <rule name="namea"> 
          <params> 
            <item name="p" type="get" pattern="(ios|android|)"/>  
            <item name="cid" type="get" pattern="(ios|android|)"/>  
            <item name="type" type="get" pattern="(ios|android|)"/>  
            <item name="sort" type="get" pattern="(ios|android|)"/>  
            <item name="action" type="post" pattern="(ios|android|)"/>  
            <item name="userAgent" type="header" pattern="(ios|android|)"/> 
          </params> 
        </rule>  
        <rule name="nameb"> 
          <params> 
            <item name="p" type="get" pattern="(ios|android|)"/>  
            <item name="cid" type="get" pattern="(ios|android|)"/>  
            <item name="type" type="get" pattern="(ios|android|)"/>  
            <item name="sort" type="get" pattern="(ios|android|)"/>  
            <item name="action" type="post" pattern="(ios|android|)"/>  
            <item name="userAgent" type="header" pattern="(ios|android|)"/> 
          </params> 
        </rule>  
        <rule name="namec"> 
          <params> 
            <item name="p" type="get" pattern="(ios|android|)"/>  
            <item name="cid" type="get" pattern="(ios|android|)"/>  
            <item name="type" type="get" pattern="(ios|android|)"/>  
            <item name="sort" type="get" pattern="(ios|android|)"/>  
            <item name="action" type="post" pattern="(ios|android|)"/>  
            <item name="userAgent" type="header" pattern="(ios|android|)"/> 
          </params> 
        </rule>  
        <rule name="named"> 
          <params> 
            <item name="p" type="get" pattern="(ios|android|)"/>  
            <item name="cid" type="get" pattern="(ios|android|)"/>  
            <item name="type" type="get" pattern="(ios|android|)"/>  
            <item name="sort" type="get" pattern="(ios|android|)"/>  
            <item name="action" type="post" pattern="(ios|android|)"/>  
            <item name="userAgent" type="header" pattern="(ios|android|)"/> 
          </params> 
        </rule> 
      </rules> 
    </config>

    C#示例代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml.Serialization;
    namespace 多层级反序列
    {
        [XmlType(TypeName = "config")]
        public class XmlConfig
        {
            [XmlArray("rules")]
            public List<rule> rules { get; set; }
        }
        [XmlType(TypeName = "rule")]
        public class rule
        {
            [XmlAttribute]
            public string name { get; set; }
            [XmlArray("params")]
            public List<paramsItem> @params { get; set; }
        }
        [XmlType(TypeName = "item")]
        public class paramsItem
        {
            [XmlAttribute]
            public string name { get; set; }
            [XmlAttribute]
            public string type { get; set; }
            [XmlAttribute]
            public string pattern { get; set; }
        }
        class Program
        {
            static void Main(string[] args)
            {
                /*       XmlConfig xml1 = DeserializeFromXml<XmlConfig>("default.xml");   
                 *           XmlConfig xml = new XmlConfig();       SerializeToXml<XmlConfig>("default.xml", xml);       */
                XmlConfig xml1 = DeserializeFromXml<XmlConfig>("default.xml");
            }
            /// <summary>     
            /// XML序列化某一类型到指定的文件   
            /// /// </summary>   
            /// /// <param name="filePath"></param>   
            /// /// <param name="obj"></param>  
            /// /// <param name="type"></param>   
            public static void SerializeToXml<T>(string filePath, T obj)
            {
                try
                {
                    using (System.IO.StreamWriter writer = new System.IO.StreamWriter(filePath)) { System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(typeof(T)); xs.Serialize(writer, obj); }
                }
                catch (Exception ex) { }
            }
            /// <summary>     
            /// 从某一XML文件反序列化到某一类型   
            /// </summary>    
            /// <param name="filePath">待反序列化的XML文件名称</param>  
            /// <param name="type">反序列化出的</param>  
            /// <returns></returns>    
            public static T DeserializeFromXml<T>(string filePath)
            {
                try
                {
                    if (!System.IO.File.Exists(filePath))
                        throw new ArgumentNullException(filePath + " not Exists");
                    using (System.IO.StreamReader reader = new System.IO.StreamReader(filePath))
                    {
                        System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(typeof(T));
                        T ret = (T)xs.Deserialize(reader);
                        return ret;
                    }
                }
                catch (Exception ex)
                {
                    return default(T);
                }
            }
        }
    }

    希望本文所述对大家的C#程序设计有所帮助。

  • 相关阅读:
    2021,6,10 xjzx 模拟考试
    平衡树(二)——Treap
    AtCoder Beginner Contest 204 A-E简要题解
    POJ 2311 Cutting Game 题解
    Codeforces 990G GCD Counting 题解
    NOI2021 SDPTT D2T1 我已经完全理解了 DFS 序线段树 题解
    第三届山东省青少年创意编程与智能设计大赛总结
    Luogu P6042 「ACOI2020」学园祭 题解
    联合省选2021 游记
    Codeforces 1498E Two Houses 题解 —— 如何用结论吊打标算
  • 原文地址:https://www.cnblogs.com/bq-blog/p/xmloper2016.html
Copyright © 2011-2022 走看看