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里面有些数据是我们不想要的,这样我们实体的数据 ...
随机推荐
- gulp 压缩 js 和 css 代码
我们在写出来的代码都是非常规范的,改换行的时候就换行,改tab 的时候就有tab,还有这样做是为了后期维护方便,但是这也导致了内存占用量的增大,当把把代码发到线上,如果网速慢一点,可能很久都加载不出来 ...
- taro 事件处理
https://nervjs.github.io/taro/docs/event.html Taro 元素的事件处理和 DOM 元素的很相似.但是有一点语法上的不同: Taro 事件绑定属性的命名采用 ...
- Python中的数组和list
Python的X[y==1, 0] 最近研究逻辑回归,Iris花的经典示例,代码就不全粘贴了,具体代码参看“Iris花逻辑回归与实现” plt.plot(X[y==0, 0], X[y==0,1], ...
- 学习笔记: jstack与线程状态
jstatck可以打印JVM内部所有线程 1.查看有哪些java进程 2.查看所有线程的信息 重定向到5579.txt文件中 jstack 5579 > 5579.txt 3.线程的状态 New ...
- Centos 使用find查找
CentOS查找目录或文件 find / -name svn 查找目录:find /(查找范围) -name '查找关键字' -type d查找文件:find /(查找范围) -name 查找关键字 ...
- excel技巧--复制带excel侧边的表格
假设要复制出带excel侧边的表格内容,则使用以下步骤: 1.选择要复制的表格: 2.选择“页面布局”->“标题”选项的“打印”打勾: 3.选择“开始”->复制旁的三角选项:复制为图片: ...
- Nuke中新建线程的方法
最近维护合成部门的nuke工具包,发现不少工具的使用方法都很个人化,没有说明文档.这也导致artist在使用工具的时候比较感性,调整参数的时候缺少前后逻辑,长此以往,artist会产生这种意识:只要最 ...
- 写了一个RenderInBackground的脚本
某主管希望write节点有多线程渲染的功能,而nuke中的render in background功能恰恰可以多个渲染任务同时执行,于是我考虑使用这个方法来实现. 调 试过程中发现renderinba ...
- position和float小结
position属性值 Position的属性值共有四个static.relative.absolute.fixed. static 所有元素在默认的情况下position属性均为static,而我们 ...
- 黄聪:wordpress如何携带cookie模拟浏览器访问网站
$args = array( 'user-agent' => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, li ...