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里面有些数据是我们不想要的,这样我们实体的数据 ...
随机推荐
- java 连接 hiveserver2 例子
启动了 hiveserver2 以后才能使用 程序连接 .目前的 使用的 是 server2 版本.和以前的版本驱动包名不同: package hadoop; import java.sql.Co ...
- elastic 部分更新 retry_on_conflict 和 数据库写锁 详细比对
1 数据库的 update 在修改这条数据的的过程中(这个过程指的是 数据库执行update 到 事务提交的过程中 )为这条数据加上 写锁,阻止 别的事务 对锁定数据的修改,请求后一个修改事务的线程 ...
- ASP.NET AJAX入门系列(11):在多个UpdatePanle中使用Timer控件
本文将使用Timer控件更新两个UpdatePanel控件,Timer控件将放在UpdatePanel控件的外面,并将它配置为UpdatePanel的触发器,翻译自官方文档. 主要内容 在多个Upda ...
- Qt 中的事件处理(一)
1.图形界面应用程序的消息处理模型 特点: 基于操作系统才能运行 GUI应用程序提供的功能必须由用户触发 用户操作界面时操作系统是第一个感知的 系统内核的消息通过事件处理转变成QT的信号 2. Qt中 ...
- CentOS7创建本地yum源
[root@master ~]# mkdir -p /var/www/html 使用安装系统的ISO镜像文件CentOS-7-x86_64-Everything-1611.iso 把CentOS-7- ...
- 一:elasticsearch常用操作总结
索引 搜索 mapping 分词器 1.创建索引 http://192.168.65.131:9200/smartom_index 2.查看索引: http://192.168.65.131:9200 ...
- debian的python蓝牙库
sudo apt--dev pip install bluepy
- NSIS 制作简单安装包
;replace NSIS/Contrib/zip2exe/Modern.nsh;NSI format: Asni;http://nsis.sourceforge.net/ ;UAC级别Request ...
- java网络编程Socket通信详解
Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket.像大家熟悉的QQ.MSN都使用了Socket相关的技术. ...
- C++11--随机数引擎和随机数分布<random>
/* 随机数引擎: * 有状态的随机数发生器,生成在预定义的最大小值之间的随机数 * 不是真正的随机数--伪随机 */ int main () { std::default_random_engine ...