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
    {
        /// <summary>  
        /// 将XML序列化为实体
        /// </summary>  
        /// <typeparam name="T"></typeparam>  
        /// <param name="xmlObj"></param>  
        /// <returns></returns>  
        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);
            }
        }

        /// <summary>
        /// 将对象序列化为xml
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        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();
            }
        }

        /// <summary>
        /// 删除命名空间
        /// </summary>
        /// <param name="xmlDocument"></param>
        /// <returns></returns>
        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)));
        }
    }
}

注意事项

xml 字符串验证

/// <summary>
/// Xml字符串格式验证
/// </summary>
/// <param name="xmlString">Xml字符串</param>
/// <returns></returns>
public static bool IsValidXml(string xmlString)
{
    try
    {
        // 创建XmlDocument对象,加载xml字符串
        new XmlDocument().LoadXml(xmlString);
        // 如果没有异常,则说明xml字符串是有效的
        return true;
    }
    catch (XmlException ex)
    {
        // 如果有异常,则说明xml字符串是无效的
        return false;
    }
}

实体序列化为 xml

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

[XmlRoot("department")]
public class Department {
    public string DeptName { get; set; };
    
	[XmlElement("Employee")]
    public List<Employee> Details { get; set; };
}

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">
<!-- blah blah blah -->
</department>

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

xml 序列化为实体

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑夜中的潜行者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值