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);
                }
            }
        }
    }
  • 相关阅读:
    hibernate 多对多 最佳实践
    世界上速度最快的输入法 Fleksy 为了支持中国
    他们控制的定义-DragButton
    怎么样linux下的目录名的目录,系统用来操作空间
    无形的力量,看得见的手
    如何设置eclipse在默认模式下打开文件
    【比赛组织和共享源代码】那些红卫兵游戏
    [Oracle] 分析功能(1)- 语法
    SAP ABAP第一,两,三代出口型BADI实现 解释的概念
    JSP简单的练习-功能标签
  • 原文地址:https://www.cnblogs.com/Violety/p/9361246.html
Copyright © 2011-2022 走看看