• C# XML序列化与反序列化记录


    简介与实现

    .NET提供了很不错的XML序列化/反序列化器
    所在命名空间:System.Xml.Serialization

    • 封装实现代码
    using System.IO;
    using System.Linq;
    using System.Xml.Linq;
    using System.Xml.Serialization;
    
    namespace Unified.Services.Core
    {
        public class XmlSerializerHelper
        {
            ///   
            /// 将XML序列化为实体
            ///   
            ///   
            ///   
            ///   
            public static T DeserializeXML<T>(string xmlObj)
            {
                XmlSerializer serializer = new XmlSerializer(typeof(T),new XmlRootAttribute("response"));
                using (StringReader reader = new StringReader(xmlObj))
                {
                    return (T)serializer.Deserialize(reader);
                }
            }
    
            /// 
            /// 将对象序列化为xml
            /// 
            /// 
            /// 
            public static string SerializeXml(object data)
            {
                using (StringWriter sw = new StringWriter())
                {
                    XmlSerializer xz = new XmlSerializer(data.GetType());
                    xz.Serialize(sw, data);
    
                    XElement xmlDocumentWithoutNs = RemoveAllNamespaces(XElement.Parse(sw.ToString()));
    
                    return xmlDocumentWithoutNs.ToString();
                }
            }
    
            /// 
            /// 删除命名空间
            /// 
            /// 
            /// 
            private static XElement RemoveAllNamespaces(XElement xmlDocument)
            {
                if (!xmlDocument.HasElements)
                {
                    XElement xElement = new XElement(xmlDocument.Name.LocalName);
                    xElement.Value = xmlDocument.Value;
                    foreach (XAttribute attribute in xmlDocument.Attributes())
                        xElement.Add(attribute);
                    return xElement;
                }
                return new XElement(xmlDocument.Name.LocalName, xmlDocument.Elements().Select(el => RemoveAllNamespaces(el)));
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    注意事项

    xml 字符串验证

    /// 
    /// Xml字符串格式验证
    /// 
    /// Xml字符串
    /// 
    public static bool IsValidXml(string xmlString)
    {
        try
        {
            // 创建XmlDocument对象,加载xml字符串
            new XmlDocument().LoadXml(xmlString);
            // 如果没有异常,则说明xml字符串是有效的
            return true;
        }
        catch (XmlException ex)
        {
            // 如果有异常,则说明xml字符串是无效的
            return false;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    实体序列化为 xml

    序列化集合的时候不要“再包一层”

    [XmlRoot("department")]
    public class Department {
        public string DeptName { get; set; };
        
    	[XmlElement("Employee")]
        public List<Employee> Details { get; set; };
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    xml序列化与json序列化不一样,顶级标签名是当前实体的 Class Name 所以需要进行特性标注[XmlRoot(“elementName”)],标注之后当前类的 Class Name 就成了序列化之后xml的顶级标签名。

    List 集合类型序列化也同意需要进行标注,如上。

    双标签序列化

    这里的 “双标签” ,是指当属性为 null 时 默认序列化当前标签为单标签,很多时候我们需要的是 Value 为空时标签也是双标签。当然上述实现代码就是,属性为 null 时也是双标签。

    删除命名空间

    xml 序列化之后默认会有类似下面这种,带有 namespace 的内容

    <department xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    
    department>
    
    • 1
    • 2
    • 3

    实现代码中的 RemoveAllNamespaces() 方法就是用来删除 namespace 的

    xml 序列化为实体

    xml 序列化为实体需要注意的是顶级标签 XmlRootAttribute(“elementName”) 这里默认是添加了指定顶级标签名的

  • 相关阅读:
    VUE-cesium(综合demo-01配置基础项)
    前端学习笔记——第四到七天
    分布式事务解决方案
    Java---Stream进阶
    SpringBoot 2.5.5整合轻量级的分布式日志标记追踪神器TLog
    Linux内核互斥技术1
    【性能测试】Linux的下的Jmeter进行远程调用
    海康机器人工业相机IP设置方式
    zookeeper 查询注册的 dubbo 服务
    ON java8碎片(2)
  • 原文地址:https://blog.csdn.net/qq_43562262/article/details/127345097