问题
有的项目使用webservice返回结果是xml,需要进行xml序列化和反序列化
xml序列化相关特性
C#中,XML序列化相关的特性主要包括:
XmlIgnore
:这个特性可以用来指示序列化过程忽略一个属性或一个字段。当使用XmlIgnore特性时,被标记的属性或字段将不会被序列化到XML。XmlAttribute
:这个特性可以用来指示序列化过程将一个属性或字段作为一个XML属性而不是元素。XmlElement
:这个特性可以用来指定序列化过程将一个属性或字段作为一个XML元素。XmlText
:这个特性可以用来指定序列化过程将一个属性或字段的值作为XML文本节点。XmlType
:这个特性可以用来指定序列化过程为类或结构体生成一个特定的XML类型名称。XmlRoot
:这个特性可以用来指定序列化过程的根元素名称和可选的命名空间。XmlAccessType
:这个特性可以用来指定属性或字段的访问类型,以控制它们在序列化过程中是否可读或可写。这些特性可以在类、属性或字段上使用,以控制C#对象如何被序列化为XML。
案例代码
XmlHelper.cs
using System.Text;
using System.Xml;
using System.Xml.Serialization;namespace XmlStu02
{/// <summary>/// xml帮助类/// </summary>public class XmlHelper{/// <summary>/// 对象转化为xml字符串,如果有参数为null则不进行序列化/// </summary>/// <param name="obj"></param>/// <param name="isFormat">是否进行格式化</param>/// <param name="isNeedHeader">是否需要xml请求头</param>/// <returns></returns>public static string ObjectToXmlString(object obj, bool isNeedHeader = false, bool isFormat = false){try{XmlSerializer xmlSerializer = new XmlSerializer(obj.GetType());XmlWriterSettings settings = new XmlWriterSettings();settings.Encoding = new UTF8Encoding(false);//utf-8不带BOM //Encoding.UTF8;utf-8带BOMif (isFormat){settings.Indent = true;settings.IndentChars = " ";settings.NewLineChars = "\r\n";}if (!isNeedHeader){settings.OmitXmlDeclaration = true; // 不生成声明头}using (var memoryStream = new MemoryStream())using (XmlWriter xmlWriter = XmlWriter.Create(memoryStream, settings)){// 强制指定命名空间,覆盖默认的命名空间XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();namespaces.Add(string.Empty, string.Empty);xmlSerializer.Serialize(xmlWriter, obj, namespaces);var xmlString = Encoding.UTF8.GetString(memoryStream.ToArray());return xmlString;};}catch{return string.Empty;}}/// <summary>/// 将XML数据反序列化为对象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="xmlData"></param>/// <returns></returns>public static T? XmlStringToObject<T>(string xmlData) where T : class{// 创建XmlSerializer实例 XmlSerializer serializer = new XmlSerializer(typeof(T));// 使用XmlReader读取XML并反序列化为Person对象 using (StringReader reader = new StringReader(xmlData)){XmlReader xmlReader = XmlReader.Create(reader);T? result = serializer.Deserialize(xmlReader) as T;return result;}}}
}
FriendModel
using System.Xml.Serialization;namespace XmlStu02
{/// <summary>/// 好朋友/// </summary>[XmlRoot("FRIEND")]public class FriendModel{/// <summary>/// 姓名/// </summary>[XmlAttribute("NAME")]public string? Name { get; set; }/// <summary>/// 性别/// </summary>[XmlAttribute("SEX")]public string? Sex { get; set; }}
}
ChildModel
using System.Xml.Serialization;namespace XmlStu02
{/// <summary>/// 孩子模型/// </summary>[XmlRoot("CHILD")]public class ChildModel{/// <summary>/// 姓名/// </summary>[XmlElement("NAME")]public string? Name { get; set; }/// <summary>/// 出生日期/// </summary>[XmlElement("BIRTHDAY")]public string? BirthDay { get; set; }/// <summary>/// 好朋友有多个/// </summary>[XmlElement("FRIEND")]public List<FriendModel>? Friends { get; set; }}
}
ParentModel
using System.Xml.Serialization;namespace XmlStu02
{/// <summary>/// 父类模型/// </summary>[XmlRoot("PARENT")]public class ParentModel{/// <summary>/// 姓名/// </summary>[XmlElement("NAME")]public string? Name { get; set; }/// <summary>/// 出生日期/// </summary>[XmlElement("BIRTHDAY")]public string? BirthDay { get; set; }/// <summary>/// 孩子,有多个/// </summary>[XmlElement("CHILDREN")]public List<ChildModel>? Children { get; set; }}
}
测试
using System.Text.Json;namespace XmlStu02
{internal class Program{/// <summary>/// 程序入口方法/// </summary>/// <param name="args"></param>static void Main(string[] args){var friend = new FriendModel();friend.Name = "小明";friend.Sex = "男";Console.ForegroundColor = ConsoleColor.Green;Console.WriteLine(XmlHelper.ObjectToXmlString(friend, true, true));var child = new ChildModel();child.Name = "大孩子";child.BirthDay = null;child.Friends = new List<FriendModel>() {friend,new FriendModel(){Name="小红",Sex="女"}};Console.ForegroundColor = ConsoleColor.Red;Console.WriteLine(XmlHelper.ObjectToXmlString(child, true, true));var parnent = new ParentModel();parnent.Name = "父亲";parnent.BirthDay = "1970-10-01";parnent.Children = new List<ChildModel>(){child,new ChildModel(){Name="小孩子",BirthDay="1995-02-18"}};Console.ForegroundColor = ConsoleColor.Blue;var parentXml = XmlHelper.ObjectToXmlString(parnent, true, true);Console.WriteLine(parentXml);var xmlParent = XmlHelper.XmlStringToObject<ParentModel>(parentXml);if (xmlParent != null){Console.ForegroundColor = ConsoleColor.Yellow;Console.WriteLine("xml反序列化成功");Console.ForegroundColor = ConsoleColor.Magenta;var jsonConfig = new JsonSerializerOptions{WriteIndented = true, // 可选,仅用于格式化输出 Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping};Console.WriteLine(System.Text.Json.JsonSerializer.Serialize(xmlParent, jsonConfig));}Console.ForegroundColor = ConsoleColor.White;}}
}