题外篇:现在的AI是真的强大,使用AI找了一段代码,直接使用就可以件微信xml字符串与实体相互转换。使用百度AI,输入“.NET 微信 xml 转换 实体 互转方法 自定义转写方法 实体中的类也可以自动转换 不使用 XmlRoot XmlElement” 就可以获取到代码,使用百度搜索却很难找到。
现在开始写代码了。
微信xml字符串与实体的互转(支持嵌套类),转化类:WeChatXmlHelper
/// <summary> /// 微信xml字符串与实体的互转(支持嵌套类) /// </summary> public class WeChatXmlHelper { /// <summary> /// 微信xml字符串转实体 /// </summary> /// <typeparam name="T">实体</typeparam> /// <param name="xml">微信xml字符串</param> /// <returns></returns> public static T? Parse<T>(string xml) where T : new() { var doc = new XmlDocument(); doc.LoadXml(xml); var element = doc.DocumentElement; if (element != null) { return ParseNode<T>(element); } return default(T); } /// <summary> /// 微信实体转xml字符串 /// </summary> /// <typeparam name="T">实体</typeparam> /// <param name="obj">实体</param> /// <returns></returns> public static string ToXml<T>(T obj) { var sb = new StringBuilder(); using (var writer = XmlWriter.Create(sb, new XmlWriterSettings { OmitXmlDeclaration = true, Indent = true })) { writer.WriteStartElement("xml"); WriteObject(writer, obj); writer.WriteEndElement(); } return sb.ToString(); } /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="node"></param> /// <returns></returns> private static T ParseNode<T>(XmlNode node) where T : new() { var obj = new T(); var props = typeof(T).GetProperties(); foreach (XmlNode child in node.ChildNodes) { var prop = Array.Find(props, p => string.Equals(p.Name, child.Name, StringComparison.OrdinalIgnoreCase)); if (prop != null) { object? value = GetValueFromNode(child, prop.PropertyType); if (value != null) { prop.SetValue(obj, value); } } } return obj; } /// <summary> /// 获取节点内容 /// </summary> /// <param name="node">节点</param> /// <param name="targetType">节点类型</param> /// <returns></returns> private static object? GetValueFromNode(XmlNode node, Type targetType) { string? value = node.FirstChild?.NodeType == XmlNodeType.CDATA ? node.FirstChild.Value : node.InnerText; if (targetType == typeof(string)) return value; if (targetType.IsClass && targetType != typeof(string)) { return typeof(WeChatXmlHelper).GetMethod("ParseNode", BindingFlags.NonPublic | BindingFlags.Static)?.MakeGenericMethod(targetType).Invoke(null, new object[] { node }); } return Convert.ChangeType(value, targetType); } /// <summary> /// /// </summary> /// <param name="writer"></param> /// <param name="obj"></param> private static void WriteObject(XmlWriter writer, object? obj) { if (obj == null) return; foreach (var prop in obj.GetType().GetProperties()) { var value = prop.GetValue(obj); if (value == null) continue; writer.WriteStartElement(prop.Name); if (prop.PropertyType.IsClass && prop.PropertyType != typeof(string)) WriteObject(writer, value); else writer.WriteCData(value.ToString()); writer.WriteEndElement(); } } }
实体类:WxMessage
public class WxMessage { public string ToUserName { get; set; } = string.Empty; public string FromUserName { get; set; } = string.Empty; public long CreateTime; public string MsgType { get; set; } = string.Empty; public string Content { get; set; } = string.Empty; public Video Video { get; set; } } public class Video { public string MediaId { get; set; } = string.Empty; public string Title { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; }
具体使用示例代码:
string xml = @" <xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType><![CDATA[video]]></MsgType> <Video> <MediaId><![CDATA[media_id]]></MediaId> <Title><![CDATA[title]]></Title> <Description><![CDATA[description]]></Description> </Video> </xml>"; //微信xml字符串转实体 var msg = WeChatXmlHelper.Parse<WxMessage>(xml); if (msg != null) { Console.WriteLine( $"收到消息:{System.Text.Json.JsonSerializer.Serialize(msg)}"); var reply = new WxMessage { ToUserName = msg.FromUserName, FromUserName = msg.ToUserName, CreateTime = msg.CreateTime, MsgType = msg.MsgType, Video = msg.Video }; //微信实体转xml字符串 string replyXml = WeChatXmlHelper.ToXml(reply); Console.WriteLine(replyXml); }
以上代码已经经过测试能够互相转换。
浙公网安备 33010602011771号