将实体转成XML,XML节点顺序由我控制
一、前言
由于有时候返回xml格式比较严格,需要按照一定的顺序排列节点才能够符合要求,这里主要用到了自定义一个List<string> 字符顺序,再让实体属性按照List定义好的顺序重新排列实体属性集合,在用 foreach遍历实体属性集合的时候方便操作拼接XML元素。
二、新建一个控制台程序做测试就好了
1.定义三个类
public class Person
{
public string Name{get;set;}
public string Sex { get; set; }
public int Age { get; set; }
public string Address { get; set; }
public string Province { get; set; }
}
public class Father
{
public string Name { get; set; }
public string Sex { get; set; }
public int Age { get; set; }
public Son Son { get; set; }
}
public class Son
{
public string SonName { get; set; }
public int SonAge { get; set; }
}
2.定义一个将实体转成XDocument的方法
static XDocument ChangeToXDocument<T>(T entity) where T : class,new() //加约束
{
entity = entity ?? new T();
XDocument doc = new XDocument();
doc.Add(new XElement("xml"));
var root = doc.Root;
List<string> list = new List<string> { "Name", "Age", "Sex" };
if (entity is Person)
{
list.AddRange(new string[] { "Province", "Address" }); //xml文档格式元素节点按照这个顺序填写
}
else if (entity is Father)
{
list.AddRange(new string[] { "Son", "SonName", "SonAge" }); //xml文档格式元素节点按照这个顺序填写
}
var proNewList = entity.GetType().GetProperties().OrderBy(p => list.IndexOf(p.Name)).ToList(); //entity实体属性按照list的顺序重新排好了
foreach (var prop in proNewList)
{
var propName = prop.Name;
if (propName == "Son")//说明要有Son节点,因为Son在这里是一个类,所以得再次调用 ChangeToXDocument<T>(T entity)方法
{
var sonElement = new XElement("Son");
var son = prop.GetValue(entity, null) ;//获取Son类中的对象了
var subNodes = ChangeToXDocument(son);
sonElement.Add(subNodes.Root.Elements());//Son节点添加里面的子节点
root.Add(sonElement);//根节点添加Son节点
}
else //其他类型要做处理,可以在这里做判断处理完再加到root上面
{
root.Add(new XElement(propName, prop.GetValue(entity, null)));
}
}
return doc;
}
3.控制台调用输出
static void Main(string[] args)
{
Person p = new Person();
p.Name = "校长";
p.Sex = "男";
p.Age = ;
p.Address = "长隆长隆";
p.Province = "广东省";
Console.WriteLine("---------------person-----------------");
string str = ChangeToXDocument(p).ToString();
Console.WriteLine(str);
Console.WriteLine("---------------father-----------------");
Father f = new Father();
f.Name = "父亲";
f.Age = ;
f.Sex = "男";
Son s = new Son();
s.SonName = "儿子";
s.SonAge = ;
f.Son = s;
string str1 = ChangeToXDocument(f).ToString();
Console.WriteLine(str1);
Console.ReadKey();
}
演示结果:
将实体转成XML,XML节点顺序由我控制的更多相关文章
- Hibernate实体映射配置(XML)简单三步完美配置
我们在使用Hibernate框架的时候,非常纠结的地方就是实体和表之间的映射,今天借助汤老师的思路写了小教程,以后配置不用纠结了! 第一步:写注释 格式为:?属性,表达的是本对象与?的?关系. 例:“ ...
- xml文件生成方式一(字符串拼接,将多实体类对象写入xml文件)
1.xml文件生成,拼接字符串使用StringBuffer或StringBuilder 2.拼接好后写入文件即可,将多个实体类写入xml文件 3.这种方式比较简单,但是操作也比较麻烦 4.下面是我的代 ...
- 实体转XML XML转实体
// <summary> /// 实体类序列化成xml /// </summary> /// <param name="enitities">实 ...
- 2.6 XML配置:XML文件节点说明
来源:http://blog.csdn.net/five3/article/details/25907693 TestNG的DTD检查文件:http://testng.org/testng-1.0.d ...
- TreeView 读取 xml 显示节点
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Tree2_xml.aspx.c ...
- Power Designer导出实体类和NHibernate xml文件
Power Designer导出实体类和NHibernate xml文件 今天研究了一下通过PowerDesigner生成实体类和NHibernate所需要的xml文件,方法是通过Power Desi ...
- 递归遍历所有xml的节点及子节点
import java.io.File; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; i ...
- C# Xml.Serialization 节点重命名
XmlElement 节点重命名 XmlRoot 根节点重名称 XmlArray List集合添加根节点 XmlArrayItem List集合中子节点重命名 [Serializable] 将该类标记 ...
- VB 老旧版本维护系列---读取xml某个节点的值
读取xml某个节点的值 '定义xml字符串内容地址 Dim xmlFileStr As String = "" '定义所需读取节点的名称 Dim readNodeName As S ...
随机推荐
- Sed命令学习
1.Sed简介 流数据编辑器 Stream editer(sed),它是一种行编辑器(对应于全屏编辑器),一次处理一行的内容.默认不编辑原文件内容(-i会直接修改原文件).处理时,它先将当前符 ...
- POJ2002 二分查找&哈希
问题重述: 给定整数n,以及n个点的坐标xi, yi.求这n个点可以组成的正方形的数目(每个点可重复使用). 分析: 根据正方形的性质,给定两个点就能确定可能构成的两个正方形的另外两个顶点.因此,只需 ...
- django settings最佳配置
# encoding=utf-8 import os import socket SITE_ID = 1 # 项目的根目录 # 简化后面的操作 PROJECT_ROOT = os.path.dirna ...
- frame嵌套的学习
iframe嵌套的学习 具体代码<br /> window.onload=function(){<br /> var voteid=window.parent.parent.d ...
- UITableView常用属性和方法 - 永不退缩的小白菜
UITableView常用属性和方法 - 永不退缩的小白菜 时间 2014-05-27 01:21:00 博客园精华区原文 http://www.cnblogs.com/zhaofucheng11 ...
- iOS开发中的Html解析方法
iOS开发中的Html解析方法 本文作者为大家介绍了在iOS开发中的Html解析方法,并同时提供了Demo代码的下载链接,Demo 解析了某个网站(具体可在代码中查看)的html网页,提取了图片以及标 ...
- PYTHON线程知识再研习G--线程间通信Event
很多时候,线程之间会有互相通信的需要.常见的情形是次要线程为主要线程执行特定的任务,在执行过程中需要不断报告执行的进度情况.前面的条件变量同步已经涉及到了线程间的通信(threading.Condit ...
- Codeforces 276D Little Girl and Maximum XOR
题意:给范围l,r选两个数亦或最大是多少. 思路:找到第一个l和r二进制下不相同的位置i,然后答案就是2^(i+1)-1,因为一个取0一个取1之后,后面的位置全部选1和全部选0,就是这样:011111 ...
- ASP.NET中默认的一级目录
默认一级目录结构: /Controllers – 存放负责处理 存放负责处理 URL请求的控制器类: 类:/Models – 存放表示和操纵数据以及业务对象的类: /Views – 存放负责呈现输出内 ...
- Why Memory Barrier?
引言:xchg做了什么? 首先,xchg eax, ecx并不会比mov edx, eax + mov eax, ecx + mov ecx, edx这三条指令加一起快,原因是xchg有副作用. Mi ...