C# 运用反射把实体类反射成你所想要的格式
下面是要转换成的Xml格式
<?xml version="1.0" encoding="UTF-8" ?>
<NDEML templateVersion="1.0" >
<header>
<!-- 导出时间 -->
<exportDate>2014-10-10 22:23:34</exportDate>
<!-- 数据业务类型 -->
<dataType> N707</dataType>
<!--数据来源-->
<sourceCode ref="210000">辽宁省级平台</sourceCode>
<!--数据目标-->
<targetCode ref="00">国家平台</targetCode>
<!--数据来源类型-->
<sourceType ref="1">省平台上传</sourceType>
</header>
<body>
<bodyItem itemId="1101">
<data>
<N707>
< N707-01></ N707-01>
……
</N707>
<N707>
……
</N707>
</data>
<!--数据信息扩展,保留-->
<extendData/>
</bodyItem>
<bodyItem itemId="1102">
<data>
<N707>
< N707-01></ N707-01>
……
</N707>
<N707>
……
</N707>
……
</data>
<!--数据信息扩展,保留-->
<extendData/>
</bodyItem>
</body>
</NDEML>
我用的是C#的控制台程序写的,需要创建类,然后通过反射,递归让他实现拼装,后期要加(减)什么字段改变什么类型直接更改实体类就行了下面是C#代码
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text; namespace EntityXml
{
class Program
{
static void Main(string[] args)
{
//实例化StringBuilder
var xml = new StringBuilder();
//往StringBuilder添加
xml.AppendLine("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
//实例化明细类
var details = new UploadDetail(); details.Head = new Head() { SourceCode = new SourceCode("辽字省平台") }; details.Body = new Body(); var bodyItem = new BodyItem();
bodyItem.ItemId = "";
bodyItem.Data = new Data();
var detail1 = new Detail { N707_01 = "n707-01 1", N707_02 = "n707-02 1" };
bodyItem.Data.Details.Add(detail1);
var detail2 = new Detail { N707_01 = "n707-01 2", N707_02 = "n707-02 2" };
bodyItem.Data.Details.Add(detail2); details.Body.BodyItems.Add(bodyItem); xml.AppendLine(ToXml(details, false));
Console.WriteLine(xml.ToString());
} public static string ToXml(Entity entity, bool isValue)
{
var xml = new StringBuilder();
var type = entity.GetType();
var atts = type.GetCustomAttributes(false);
var nodeName = "";
foreach (var att in atts)
{
if (att is XmlNameAttribute)
{
var attr = att as XmlNameAttribute;
nodeName = attr.XmlName;
}
}
var pros = new List<PropertyInfo>();
xml.Append($"<{nodeName}");
foreach (var pro in type.GetProperties())
{
var proAtts = pro.GetCustomAttributes(false);
var isXmlProperty = false;
foreach (var att in proAtts)
{
//xml节点属性的属性
if (att is IsXmlPropertyAttribute)
{
isXmlProperty = true;
var attr = att as IsXmlPropertyAttribute;
if (attr.IsXmlProperty == true)
{
var IsXmlNameMark = false;
foreach (var nameAtt in proAtts)
{
if (nameAtt is XmlNameAttribute)
{
var nameAttr = nameAtt as XmlNameAttribute;
xml.Append($" {nameAttr.XmlName}=\"{pro.GetValue(entity, null).ToString()}\"");
IsXmlNameMark = true;
}
}
if (!IsXmlNameMark)
{
xml.Append($" {pro.Name}=\"{pro.GetValue(entity, null).ToString()}\"");
}
}
}
}
//节点属性
if (!isXmlProperty)
{
pros.Add(pro);
}
}
xml.AppendLine($">"); if (isValue)
{
xml.AppendLine($"{type.GetProperty("SelfValue", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(entity, null)}");
}
else
{
foreach (var pro in pros)
{
var proAtts = pro.GetCustomAttributes(false);
if (pro.PropertyType.IsSubclassOf(typeof(Entity)))
{
var childEntity = pro.GetValue(entity, null) as Entity; var isXmlValueMark = false;
foreach (var att in proAtts)
{
if (att is IsXmlValueAttribute)
{
isXmlValueMark = true;
xml.AppendLine(ToXml(childEntity, true));
break;
}
}
if (!isXmlValueMark)
{
xml.AppendLine(ToXml(childEntity, false));
}
}
else
{
if (pro.PropertyType.IsGenericType)
{
var list = pro.GetValue(entity, null) as IList;
foreach (var item in list)
{
xml.AppendLine(ToXml(item as Entity, false));
}
}
else
{
var IsXmlNameMark = false;
foreach (var att in proAtts)
{
IsXmlNameMark = true;
if (att is XmlNameAttribute)
{
var attr = att as XmlNameAttribute;
xml.AppendLine($"<{attr.XmlName}>{pro.GetValue(entity, null)}</{attr.XmlName}>");
}
}
if (!IsXmlNameMark)
{
if (pro.PropertyType.Name == "DateTime")
{
if (pro.GetValue(entity, null) == null)
{
xml.AppendLine($"<{pro.Name}></{pro.Name}>");
}
else
{
xml.AppendLine($"<{pro.Name}>{Convert.ToDateTime(pro.GetValue(entity, null)).ToString("yyyy-MM-dd HH:mm:ss")}</{pro.Name}>");
}
}
else
{
xml.AppendLine($"<{pro.Name}>{pro.GetValue(entity, null)}</{pro.Name}>");
}
}
}
}
}
}
xml.Append($"</{nodeName}>");
return xml.ToString();
}
} public abstract class Entity
{ }
/// <summary>
/// 上传明细类
/// </summary>
[XmlName("NDEML")]
public class UploadDetail : Entity
{
[IsXmlProperty(true)]
[XmlName("templateVersion")]
public string TemplateVersion { get; set; } = "1.0"; public Head Head
{ get; set; }
public Body Body
{ get; set; } }
[XmlName("head")]
public class Head : Entity
{
/// <summary>
/// 导出时间
/// </summary>
public DateTime exportDate { get; set; } = DateTime.Now;
/// <summary>
/// 导出数据的业务类型,填写 N707
/// </summary>
public string dataType { get; set; } = "N707";
/// <summary>
/// 固定填写1
/// </summary>
public string sourceType { get; set; } = "";
/// <summary>
/// 固定填写210000
/// </summary>
[IsXmlValue(true)]
public SourceCode SourceCode { get; set; }
/// <summary>
/// 固定填写00
/// </summary>
public string targetCode { get; set; } = ""; }
[XmlName("sourceCode")]
public class SourceCode : Entity
{
public SourceCode(string selfValue)
{
SelfValue = selfValue;
}
[IsXmlProperty(true)]
[XmlName("ref")]
public string Ref { get; set; } = ""; private string SelfValue
{ get; set; } } [XmlName("body")]
public class Body : Entity
{
public List<BodyItem> BodyItems { get; set; } = new List<BodyItem>();
}
[XmlName("bodyItem")]
public class BodyItem : Entity
{
[IsXmlProperty(true)]
[XmlName("itemId")]
public string ItemId { get; set; }
///// <summary>
///// 0表示撤销部分项目;1表示撤销该患者本次住院所有上传的费用明细,data中可无内容
///// </summary>
//public int cancelMode { get; set; }
/// <summary>
/// 扩展,备用
/// </summary>
[XmlName("extendData")]
public string ExtendData
{ get; set; } /// <summary>
/// 主数据
/// </summary>
[XmlName("data")]
public Data Data
{
get; set;
} }
[XmlName("data")]
public class Data : Entity
{
public List<Detail> Details
{
get; set;
} = new List<Detail>();
} [XmlName("N707")]
public class Detail : Entity
{
/// <summary>
/// 住院处方流水号 100
/// </summary>
[XmlName("N707-01")]
public string N707_01
{ get; set; } /// <summary>
/// 项目序号(费用明细HIS系统唯一标识) 36
/// </summary>
[XmlName("N707-02")]
public string N707_02
{ get; set; } } /// <summary>
/// 是否节点值
/// </summary>
[AttributeUsage(AttributeTargets.Property)]
public class IsXmlValueAttribute : Attribute
{
public IsXmlValueAttribute(bool isXmlValue)
{
IsXmlValue = isXmlValue;
}
public bool IsXmlValue
{
get; private set;
}
} /// <summary>
/// 是否xml属性
/// </summary>
[AttributeUsage(AttributeTargets.Property)]
public class IsXmlPropertyAttribute : Attribute
{
public IsXmlPropertyAttribute(bool isXmlProperty)
{
IsXmlProperty = isXmlProperty;
}
public bool IsXmlProperty
{
get; private set;
}
} /// <summary>
/// xml名称特性
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property)]
public class XmlNameAttribute : Attribute
{
public XmlNameAttribute(string xmlName)
{
XmlName = xmlName;
} public string XmlName
{
get;
private set;
} }
}
在这我也有点偷懒了,实体类之定义了一点点,实现了功能。运行之后是这个效果

希望对你有所帮助!
C# 运用反射把实体类反射成你所想要的格式的更多相关文章
- c# 反射得到实体类的字段名称和值,DataTable转List<T>
/// <summary> /// 反射得到实体类的字段名称和值 /// var dict = GetProperties(model); /// </summary> /// ...
- java反射对实体类取值和赋值,可以写成通过实体类获取其他元素的数据,很方便哦~~~
项目中需要过滤前面表单页面中传过来的实体类的中的String类型变量的前后空格过滤,由于前几天看过一个其他技术博客的的java反射讲解,非常受益.于是,哈哈哈 public static <T& ...
- 利用c#反射实现实体类生成以及数据获取与赋值
转:http://hi.baidu.com/xyd21c/item/391da2fc8fb351c10dd1c8b8 原有的实体类成员逐个赋值与获取的方法弊端: 1.每次对实体类属性进行赋值时,都要检 ...
- java反射对实体类取值和赋值
public static void checkDesignerEdit(Object dtos) throws Exception { Class dtosClass = dtos.getClass ...
- java反射遍历实体类属性和类型,并赋值和获取值
/* * GetModelNameAndType.java * Version 1.0.0 * Created on 2017年12月15日 * Copyright ReYo.Cn */ packag ...
- .NET解析xml字符串,通过反射给实体类对象赋值,获取实体类数据列表
/// <summary> /// 解析xml字符串 转换为实体类列表数据 /// </summary> /// <param name="xmlStr&quo ...
- C#利用反射获取实体类的主键名称或者获取实体类的值
//获取主键的 PropertyInfo PropertyInfo pkProp = ).FirstOrDefault(); //主键名称 var keyName=pkProp.Name; //实体类 ...
- 【转】C#中将JSon数据转换成实体类,将实体类转换成Json
http://wo13145219.iteye.com/blog/2022667 http://json2csharp.chahuo.com/ using System; using System.C ...
- Java 将JSON反射到实体类
通过服务间调用拿到的数据返回的格式是JSON,如果你当前这个服务有实体数据类型可以对应上,那么就可以轻松愉快的搞定. 如果数据格式对不上,例如这个JSON里面有些数据是我们不想要的,这样我们实体的数据 ...
随机推荐
- toString() 和 toLocaleString() 的区别
toString() 和 toLocaleString() 的区别 table th:nth-of-type(4) { width: 400px; } 区别项 toString() toLocaleS ...
- java-plupload上传大文件
参考链接: https://blog.csdn.net/hjf_1291030386/article/details/74784172 https://www.cnblogs.com/tengyunh ...
- JMeter ----与WebDriver安装与测试
JMeter ----与WebDriver安装与测试 主要内容 JMeter安装 WebDriver安装 一个简单的JMeter+WebDriver示例 环境与参考 jvm版本: 1.8.0_65 j ...
- Nginx + Tomcat搭建集群
一.Tomcat集群带来的好处 1.提高服务的性能,并发能力,以及高可用性 2.提供项目架构的横向扩展能力 二.Tomcat集群实现原理 通过Nginx负载均衡进行请求转发 三.Nginx + Tom ...
- 免费SMTP邮件服务:Mandrill,Sendgrid,Mailjet,Postmarkapp,MailChimp
免费的SMTP发邮件服务平常几乎都没有怎么关注,Wordpress发邮件几乎用普通的邮箱的SMTP服务就可以完成任务,但是自从用了Discourse.Ghost博客后,发现找到一个合适的.免费配额大的 ...
- 为什么人工智能用Python
开发效率高.python有很多库很方便做人工智能,比如numpy, scipy做数值计算的,sklearn做机器学习的,pybrain做神经网络的,matplotlib将数据可视化的. 如果很在乎性能 ...
- mha error
MasterFailover.pm 1473 $ret =1474 $_server_manager->change_master_and_start_slave( $target, $late ...
- Java封装案例
---恢复内容开始--- 在类的getter/setter方法中在getter方法中要先实列话 在构造方法中无参构造(必须要构造)好处很多!!! 描述学生信息及相关联的专业信息 把Subject和St ...
- 黄聪:安装cnpm替代默认的npm
使用cnpm替代默认的npm: npm install -g cnpm --registry=https://registry.npm.taobao.org
- PREV-9_蓝桥杯_大臣的旅费
问题描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首 ...