<?xml version="1.0" encoding="utf-8"?> <qrylist><order orderid="1234567890"></order> <order orderid="1234567891"></order> <order orderid="1234567892"></order> </qrylist>

模型定义

public class RequestXML
        {
            public qrylistModel qrylist { get; set; }
            public class qrylistModel
            {
                public ordeModel order { get; set; }
                public class ordeModel
                {
                    public string orderid { get; set; }
                }
            }
        }

使用方法:

RequestXML requestXML = new RequestXML();
            requestXML.qrylist = new RequestXML.qrylistModel();
            requestXML.qrylist.order = new RequestXML.qrylistModel.ordeModel();
            requestXML.qrylist.order.orderid = "123123123";
            StringBuilder strbuil = new StringBuilder();
            var xmlstr = XMLHelper.ModelRecurveToXML(requestXML, strbuil);
            xmlstr = strbuil.Insert(0, xmlstr).ToString();
            XmlDocument docReqContex = new XmlDocument();
            XmlDeclaration decl = docReqContex.CreateXmlDeclaration("1.0", "utf-8", null);
            docReqContex.LoadXml(xmlstr);
            docReqContex.InsertBefore(decl, docReqContex.DocumentElement);

忘记看他这个xml 格式是个List 更新一下使用方法

RequestXML requestXML = new RequestXML();
            requestXML.qrylist = new RequestXML.qrylistModel();
            requestXML.qrylist.order = new List<RequestXML.qrylistModel.ordeModel>();

            requestXML.qrylist.order.Add(new RequestXML.qrylistModel.ordeModel()
            {
                orderid="123123"
            });

            requestXML.qrylist.order.Add(new RequestXML.qrylistModel.ordeModel()
            {
                orderid = "44433333"
            });

            StringBuilder strbuil = new StringBuilder();
            var xmlstr = XMLHelper.ModelRecurveToXML(requestXML, strbuil);
            xmlstr = strbuil.Insert(0, xmlstr).ToString();
            XmlDocument docReqContex = new XmlDocument();
            XmlDeclaration decl = docReqContex.CreateXmlDeclaration("1.0", "utf-8", null);
            docReqContex.LoadXml(xmlstr);
            docReqContex.InsertBefore(decl, docReqContex.DocumentElement);

模型转XML 具体实现方法

public class XMLHelper
    {
        /// <summary>
        /// 模型转XML文件
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="model"></param>
        /// <param name="suf"></param>
        /// <param name="strIde"></param>
        /// <returns></returns>
        public static string ModelRecurveToXML<T>(T model, StringBuilder suf, string strIde = "")
        {
            if (model == null)
            {
                return string.Empty;
            }
            StringBuilder builder = new StringBuilder();
            System.Reflection.PropertyInfo[] proArray = model.GetType().GetProperties();

            foreach (System.Reflection.PropertyInfo pro in proArray)
            {
                if (pro.PropertyType.IsPrimitive || pro.PropertyType.IsSealed)
                {
                    if (string.IsNullOrWhiteSpace(strIde))
                    {
                        builder.Append(string.Format("<{0}>{1}</{2}>", pro.Name, pro.GetValue(model, null), pro.Name));
                    }
                    else
                    {
                        string value = SetXmlValue(pro.Name, pro.GetValue(model, null));
                        builder.Append(value);
                    }
                }
                else
                {
                    if (!string.IsNullOrWhiteSpace(strIde))
                    {
                        string str = "<" + strIde + builder.ToString() + ">";
                        builder = new StringBuilder();

                        builder.Append(str);
                        strIde = string.Empty;
                    }
                    var IsGenericType = pro.PropertyType.IsGenericType;
                    var list = pro.PropertyType.GetInterface("IEnumerable", false);
                    if (IsGenericType && list != null)
                    {
                        var listVal = pro.GetValue(model, null) as IEnumerable<object>;
                        if (listVal == null) continue;

                        foreach (var aa in listVal)
                        {
                            var dtype = aa.GetType();
                            builder.Append(ModelRecurveToXML(aa, suf, pro.Name) + " </" + pro.Name + ">");
                        }
                    }
                    else
                    {

                        var val = pro.GetValue(model, null);
                        if (val != null)
                        {
                            suf.Insert(0, "</" + pro.Name + ">");
                        }
                        builder.Append(ModelRecurveToXML(val, suf, pro.Name));
                    }

                }
            }
            if (!string.IsNullOrWhiteSpace(strIde))
            {
                builder.Insert(0, "<" + strIde + "");
                builder.Append(">");
            }

            return builder.ToString();
        }

        /// <summary>
        /// 设置XML 值
        /// </summary>
        /// <param name="value"></param>
        /// <param name="name"></param>
        /// <returns></returns>
        public static string SetXmlValue(string name, object value)
        {
            string str = string.Empty;
            if (value != null)
            {
                bool inse = false;
                if (value.GetType() == typeof(DateTime))
                {
                    if (default(DateTime) != (DateTime)value)
                    {
                        inse = true;
                    }
                }
                else if (value.GetType() == typeof(string))
                {
                    inse = true;
                }
                else if (value.GetType() == typeof(int))
                {
                    if (default(int) != (int)value)
                    {
                        inse = true;
                    }
                }
                else if (value.GetType() == typeof(decimal))
                {
                    if (default(decimal) != (decimal)value)
                    {
                        inse = true;
                    }
                }
                else if (value.GetType() == typeof(double))
                {
                    if (default(double) != (double)value)
                    {
                        inse = true;
                    }
                }
                if (inse)
                {
                    str = string.Format(" {0}='{1}'", name, value);
                }

            }

            return str;
        }

        /// <summary>
        /// XML 转Model
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="Model"></param>
        /// <param name="xmlContent"></param>
        /// <param name="xmlRootName"></param>
        /// <returns></returns>
        public static T XmlToModel<T>(string xmlContent)
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.XmlResolver = null;
            xmlDoc.LoadXml(xmlContent);

            object obj = Activator.CreateInstance(typeof(T));
            RecurveType(obj, xmlDoc, null);
            return (T)obj;
        }

        /// <summary>
        /// 获取XML 节点
        /// </summary>
        /// <param name="xnList"></param>
        /// <param name="stridr"></param>
        /// <returns></returns>
        public static XmlNode GetXmlNode(XmlNodeList xnList, string stridr)
        {
            XmlNode xn = null;
            foreach (XmlNode item in xnList)
            {
                xn = item.SelectSingleNode(stridr);
                if (xn == null)
                {
                    GetXmlNode(item.ChildNodes, stridr);
                    if (item.Name == stridr)
                    {
                        xn = item;
                    }
                }
            }
            return xn;
        }
        /// <summary>
        /// 递归XML给模型赋值
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="model"></param>
        /// <param name="xmlDoc"></param>
        /// <param name="xn"></param>
        public static void RecurveType<T>(T model, XmlDocument xmlDoc, XmlNode xn)
        {

            var type = model.GetType();

            foreach (System.Reflection.PropertyInfo pro in type.GetProperties())
            {
                if ((pro.PropertyType.IsPrimitive || pro.PropertyType.IsSealed) && xn != null)
                {
                    XmlElement xe = (XmlElement)xn;
                    var val = xe.GetAttribute(pro.Name);
                    if (string.IsNullOrWhiteSpace(val))
                    {
                        pro.SetValue(model, xe.InnerText, null);
                    }
                    else
                    {
                        pro.SetValue(model, val, null);
                    }

                }
                else
                {
                    if (pro.PropertyType.IsPrimitive || pro.PropertyType.IsSealed)
                    {
                        if (xn == null)
                        {
                            var dddddd = pro.PropertyType.BaseType.Name;
                            var ddddd = xmlDoc.SelectSingleNode(pro.Name);
                        }
                        else
                        {
                            XmlElement xe = (XmlElement)xn;
                            var val = xe.GetAttribute(pro.Name);
                            if (string.IsNullOrWhiteSpace(val))
                            {
                                pro.SetValue(model, xe.InnerText, null);
                            }
                            else
                            {
                                pro.SetValue(model, val, null);
                            }
                        }

                    }
                    else
                    {
                        XmlNode xlNode = null;
                        if (xn == null)
                        {
                            xlNode = xmlDoc.SelectSingleNode(pro.Name);

                        }
                        else
                        {
                            xlNode = xn.SelectSingleNode(pro.Name);
                            if (xlNode == null)
                            {
                                xlNode = GetXmlNode(xn.ChildNodes, pro.Name);

                            }
                        }
                        xn = xlNode;

                        var IsGenericType = pro.PropertyType.IsGenericType;
                        var list = pro.PropertyType.GetInterface("IEnumerable", false);
                        if (IsGenericType && list != null)
                        {
                            Type proType = pro.PropertyType;
                            var modelList = Activator.CreateInstance(proType) as IEnumerable<object>;
                            var listPro = modelList.GetType().GetProperty("Item");
                            var ml = listPro.PropertyType;

                            object objA = Activator.CreateInstance(ml);
                            RecurveType(objA, xmlDoc, xn);
                            var addMethod = modelList.GetType().GetMethod("Add");
                            addMethod.Invoke(modelList, new object[] { objA });
                            pro.SetValue(model, modelList, null);
                        }
                        else
                        {
                            object objA = Activator.CreateInstance(pro.PropertyType);
                            RecurveType(objA, xmlDoc, xn);
                            pro.SetValue(model, objA, null);
                        }

                    }

                }
            }
        }
    }

2021-05-25 重构 递归XML给模型赋值 因为list 数据时model 只能取到一条记录

 /// <summary>
/// 递归XML给模型赋值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="model"></param>
/// <param name="xmlDoc"></param>
/// <param name="xn"></param>
public static void RecurveType<T>(T model, XmlDocument xmlDoc, XmlNode xn)
{
var type = model.GetType();
foreach (System.Reflection.PropertyInfo pro in type.GetProperties())
{
if ((pro.PropertyType.IsPrimitive || pro.PropertyType.IsSealed) && xn != null)
{
XmlElement xe = (XmlElement)xn;
var val = xe.GetAttribute(pro.Name);
if (string.IsNullOrWhiteSpace(val))
{
pro.SetValue(model, xe.InnerText, null);
}
else
{
pro.SetValue(model, val, null);
} }
else
{
if (pro.PropertyType.IsPrimitive || pro.PropertyType.IsSealed)
{
if (xn == null)
{
var BaseType = pro.PropertyType.BaseType.Name;
xn = xmlDoc.SelectSingleNode(BaseType);
}
else
{
XmlElement xe = (XmlElement)xn;
var val = xe.GetAttribute(pro.Name);
if (string.IsNullOrWhiteSpace(val))
{
pro.SetValue(model, xe.InnerText, null);
}
else
{
pro.SetValue(model, val, null);
}
} }
else
{ var IsGenericType = pro.PropertyType.IsGenericType;
var list = pro.PropertyType.GetInterface("IEnumerable", false);
if (IsGenericType && list != null)
{
Type proType = pro.PropertyType;
var modelList = Activator.CreateInstance(proType) as IEnumerable<object>;
var listPro = modelList.GetType().GetProperty("Item"); foreach (XmlNode xns in xn.ChildNodes)
{
var ml = listPro.PropertyType; object objA = Activator.CreateInstance(ml);
RecurveType(objA, xmlDoc, xns);
var addMethod = modelList.GetType().GetMethod("Add");
addMethod.Invoke(modelList, new object[] { objA });
}
pro.SetValue(model, modelList, null);
}
else
{ if (xn == null)
{
xn = xmlDoc.SelectSingleNode(pro.Name);
}
else
{
XmlNode xlNode = xn.SelectSingleNode(pro.Name);
if (xlNode == null)
{
xlNode = GetXmlNode(xn.ChildNodes, pro.Name);
}
xn = xlNode;
}
object objA = Activator.CreateInstance(pro.PropertyType);
RecurveType(objA, xmlDoc, xn);
pro.SetValue(model, objA, null);
} } }
}
}

C# 动态类型 模型转XML的更多相关文章

  1. Python 学习 第四篇:动态类型模型

    Python的变量不用声明,赋值之后就可以直接使用,类型是在运行过程中自动确定的,这就是动态类型模型.该模型把变量和对象设计成两个不同的实体,对象是存储数据的地方,对象的类型是由初始值自动决定的,而变 ...

  2. 【.NET深呼吸】动态类型(扩充篇)

    前面两文中,老周已向大家介绍了关于动态类型对象的两种级别的使用方案,本篇呢,老周再讲一个自定义动态类型的例子. 前面给大家演示的例子中,动态类型中包装的是字典类型来存储数据的,这一次咱们换一种风味,老 ...

  3. 【.net深呼吸】动态类型(高级篇)

    前面老周给大家介绍了动态类型使用的娱乐级别用法,其实,在很多情景下,娱乐级别的用法已经满足需求了. 如果,你想自己来控制动态类型的行为和数据的存取,那么,就可以考虑用今天所说的高大上技术了.比如,你希 ...

  4. python动态类型

    在python中,省去了变量声明的过程,在引用变量时,往往一个简单的赋值语句就同时完成了,声明变量类型,变量定义和关联的过程,那么python的变量到底是怎样完成定义的呢? 动态类型 python使用 ...

  5. 【Python】python动态类型

    在python中,省去了变量声明的过程,在引用变量时,往往一个简单的赋值语句就同时完成了,声明变量类型,变量定义和关联的过程,那么python的变量到底是怎样完成定义的呢? 动态类型 python使用 ...

  6. Asp.Net SignalR 使用记录 技术回炉重造-总纲 动态类型dynamic转换为特定类型T的方案 通过对象方法获取委托_C#反射获取委托_ .net core入门-跨域访问配置

    Asp.Net SignalR 使用记录   工作上遇到一个推送消息的功能的实现.本着面向百度编程的思想.网上百度了一大堆.主要的实现方式是原生的WebSocket,和SignalR,再次写一个关于A ...

  7. JS面向对象——动态原型模型、寄生构造模型

    动态原型模型 组合使用构造函数模型和原型模型,使得OO语言程序员在看到独立的构造函数和原型时很困惑.动态原型模型致力于解决该问题,它把所有的信息封装在构造函数中,通过在构造函数中初始化原型(仅在必要情 ...

  8. C# 中的动态类型

    翻译自 Camilo Reyes 2018年10月15日的文章 <Working with the Dynamic Type in C#> [1] .NET 4 中引入了动态类型.动态对象 ...

  9. 重学c#系列——动态类型[二十二]

    前言 该系列准备继续完善,一共108篇,持续更新. 正文 为什么有动态类型呢? 是因为很多东西天生就是动态类型的. 比如xml 和 json.cvs.数据库表,这些本来就是数据类型的. 在反射系列中提 ...

  10. Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示

    Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 项:http:// ...

随机推荐

  1. C#之json字符串转xml字符串

    留爪参考 using System.Xml; // using System.Text; // using System.Runtime.Serialization.Json; //JsonReade ...

  2. 《机器人SLAM导航核心技术与实战》第1季:第8章_激光SLAM系统

    <机器人SLAM导航核心技术与实战>第1季:第8章_激光SLAM系统 视频讲解 [第1季]8.第8章_激光SLAM系统-视频讲解 [第1季]8.1.第8章_激光SLAM系统_Gmappin ...

  3. datasnap的回调广播

    感觉中的datasnap千孔百疮,到xe10已经具备冲击成千上万用户并发的能力了.应该放心用于项目实战了.补课研究10.1 datasnap开发手册. 用到的方法: (1)TDBXCallback机制 ...

  4. ShadowSql之借Dapper打通ORM最后一公里

    ShadowSql专职拼写sql,要想做为ORM就需要借高人之手 我们要借的就是Dapper,Dapper以高性能著称,ShadowSql搭配Dapper就是强强联手 为此本项目内置了一个子项目Dap ...

  5. 又一款眼前一亮的Linux终端工具!

    大家好,我是良许. 最近二舅视频刷爆了全网,大家有没去看呢?强烈推荐大家观看一波,也就 11 分钟,保证会触动你的泪点. 不过今天不讲二舅哈,还是来聊聊技术. 今天给大家介绍一款最近发现的功能十分强大 ...

  6. SAP HANA使用命令行快速导出导入

    楔子 今天折腾了接近一下午,就为了使用SAP HANA自带的命令行工具来导出数据备份. SAP HANA(后续简称Hana)是内存数据库,性能这一方面上还真没怕过谁. 由于SAP HANA提供了Han ...

  7. wget--批量下载

    wget--批量下载 wget -nd -r -l1 --no-parent --accept=jar http://192.168.38.38:81/js/jartest/ -nd 不创建目录, w ...

  8. ElasticSearch学习——帮助类

    ElasticSearch第五步-.net平台下c#操作ElasticSearch详解 - 梦亦晓 - 博客园 (cnblogs.com) C# 如何使用 Elasticsearch (ES) - 领 ...

  9. 【记录】Samba|Windows 11的Samba连接切换用户

    Samba是一个用于共享文件和打印机的网络协议,可以使不同的操作系统之间共享文件和资源变得容易.在Windows 11上,可以使用Samba来连接到网络共享. 如果您想在Windows 11上切换用户 ...

  10. 『Plotly实战指南』--Plotly与Pandas的深度融合

    在数据分析的世界中,数据处理与可视化是密不可分的两个环节. Pandas作为Python数据处理的核心工具,以其强大的数据清洗.转换和分析能力,成为数据科学家和分析师的必备利器: 而Plotly则是交 ...