题外篇:现在的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);
}

以上代码已经经过测试能够互相转换。

posted on 2025-06-25 11:46  £冷☆月№  阅读(13)  评论(0)    收藏  举报