C# 动态类型 模型转XML
<?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的更多相关文章
- Python 学习 第四篇:动态类型模型
Python的变量不用声明,赋值之后就可以直接使用,类型是在运行过程中自动确定的,这就是动态类型模型.该模型把变量和对象设计成两个不同的实体,对象是存储数据的地方,对象的类型是由初始值自动决定的,而变 ...
- 【.NET深呼吸】动态类型(扩充篇)
前面两文中,老周已向大家介绍了关于动态类型对象的两种级别的使用方案,本篇呢,老周再讲一个自定义动态类型的例子. 前面给大家演示的例子中,动态类型中包装的是字典类型来存储数据的,这一次咱们换一种风味,老 ...
- 【.net深呼吸】动态类型(高级篇)
前面老周给大家介绍了动态类型使用的娱乐级别用法,其实,在很多情景下,娱乐级别的用法已经满足需求了. 如果,你想自己来控制动态类型的行为和数据的存取,那么,就可以考虑用今天所说的高大上技术了.比如,你希 ...
- python动态类型
在python中,省去了变量声明的过程,在引用变量时,往往一个简单的赋值语句就同时完成了,声明变量类型,变量定义和关联的过程,那么python的变量到底是怎样完成定义的呢? 动态类型 python使用 ...
- 【Python】python动态类型
在python中,省去了变量声明的过程,在引用变量时,往往一个简单的赋值语句就同时完成了,声明变量类型,变量定义和关联的过程,那么python的变量到底是怎样完成定义的呢? 动态类型 python使用 ...
- Asp.Net SignalR 使用记录 技术回炉重造-总纲 动态类型dynamic转换为特定类型T的方案 通过对象方法获取委托_C#反射获取委托_ .net core入门-跨域访问配置
Asp.Net SignalR 使用记录 工作上遇到一个推送消息的功能的实现.本着面向百度编程的思想.网上百度了一大堆.主要的实现方式是原生的WebSocket,和SignalR,再次写一个关于A ...
- JS面向对象——动态原型模型、寄生构造模型
动态原型模型 组合使用构造函数模型和原型模型,使得OO语言程序员在看到独立的构造函数和原型时很困惑.动态原型模型致力于解决该问题,它把所有的信息封装在构造函数中,通过在构造函数中初始化原型(仅在必要情 ...
- C# 中的动态类型
翻译自 Camilo Reyes 2018年10月15日的文章 <Working with the Dynamic Type in C#> [1] .NET 4 中引入了动态类型.动态对象 ...
- 重学c#系列——动态类型[二十二]
前言 该系列准备继续完善,一共108篇,持续更新. 正文 为什么有动态类型呢? 是因为很多东西天生就是动态类型的. 比如xml 和 json.cvs.数据库表,这些本来就是数据类型的. 在反射系列中提 ...
- Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示
Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 项:http:// ...
随机推荐
- 【AI工具实战】一招解决英文视频困境,四步用AI搞定全中文字幕,你也可以!(文末附工具下载)
"AI时代最大的红利,是让每个人都有机会成为那个"想到就能做到"的创造者." AI粉嫩特攻队,2025年4月5日. 故事源于一个我想看的国外视频.本想点开视频准 ...
- SpringBoot 部署:外置依赖包
目录: 1.前言 2.瘦身前的Jar包 3.解决方案 一.前言 SpringBoot部署起来虽然简单,如果服务器部署在公司内网,速度还行,但是如果部署在公网(阿里云等云服务器上),部署起来实在头疼:编 ...
- java基础之集合(List)、Properties集合
一.ArrayList集合的方法 1.public void add(int index, E element) : 将指定的元素,添加到该集合中的指定位置上. 2.public E get(int ...
- FastAPI数据库集成与事务管理
title: FastAPI数据库集成与事务管理 date: 2025/04/18 00:15:34 updated: 2025/04/18 00:15:34 author: cmdragon exc ...
- 凯亚物联网平台如何通过MQTT网络组件接入设备
一.概述 有人提议我用kestrel代替Dotnetty ,那是不可能的, 物联网平台MQTT,rtmp,rtsp,httpflv,tcp,udp,rpc 都是基于dotnetty实现,压测没有问题, ...
- 解决 Dify 部署中 Podman WSL 容器文件权限问题
解决 Dify 部署中 Podman WSL 容器文件权限问题 在使用 Podman 进行 Dify 部署时,遇到了一个关键问题:启动服务时出现 initdb: error: could not ch ...
- 【记录】Python3|Selenium4 极速上手入门(Windows)
环境:Windows 版本:python3,selenium 4.11.2 写这个是方便自己重装电脑时重新装 Selenium,懒得每次都重新找链接. 文章目录 1 装 Chrome Edge 其他浏 ...
- 【经验】VMware|Win11的Ubuntu虚拟机启动虚拟化,报错此平台不支持虚拟化的 Intel VT-x/EPT(方案汇总+自己的解决方案)
2024/04/24说明:这篇暂时修改为粉丝可见,因为正在冲粉丝量,等到我弄完了粉丝量的要求,我就改回来!不方便看到全文的小伙伴不好意思!! 我开虚拟化是为了在虚拟机中运行VirtualBox,如果不 ...
- Seata源码—2.seata-samples项目介绍
大纲 1.seata-samples的配置文件和启动类 2.seata-samples业务服务启动时的核心工作 3.seata-samples库存服务的连接池配置 4.Seata对数据库连接池代理配置 ...
- 使用libdivide加速整数除法运算
在x86和ARM平台上,整数除法是相对较慢的操作.不巧的是除法在日常开发中使用频率并不低,而且还有一些其他常用的运算依赖于除法操作,比如取模.因此频繁的除法操作很容易成为程序的性能瓶颈,尤其是在一些数 ...