C#中利用LINQ to XML与反射把任意类型的泛型集合转换成XML格式字符串
在工作中,如果需要跟XML打交道,难免会遇到需要把一个类型集合转换成XML格式的情况。之前的方法比较笨拙,需要给不同的类型,各自写一个转换的函数。但是后来接触反射后,就知道可以利用反射去读取一个类型的所有成员,也就意味着可以替不同的类型,创建更通用的方法。这个例子是这样做的:利用反射,读取一个类型的所有属性,然后再把属性转换成XML元素的属性或者子元素。下面注释比较完整,就话不多说了,有需要看代码吧!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.Reflection; namespace GenericCollectionToXml
{
class Program
{
static void Main(string[] args)
{
var persons = new[]{
new Person(){Name="李元芳",Age=},
new Person(){Name="狄仁杰",Age=}
};
Console.WriteLine(CollectionToXml(persons));
} /// <summary>
/// 集合转换成数据表
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="TCollection">泛型集合</param>
/// <returns>集合的XML格式字符串</returns>
public static string CollectionToXml<T>(IEnumerable<T> TCollection)
{
//定义元素数组
var elements = new List<XElement>();
//把集合中的元素添加到元素数组中
foreach (var item in TCollection)
{
//获取泛型的具体类型
Type type = typeof(T);
//定义属性数组,XObject是XAttribute和XElement的基类
var attributes = new List<XObject>();
//获取类型的所有属性,并把属性和值添加到属性数组中
foreach (var property in type.GetProperties())
//获取属性名称和属性值,添加到属性数组中(也可以作为子元素添加到属性数组中,只需把XAttribute更改为XElement)
attributes.Add(new XAttribute(property.Name, property.GetValue(item, null)));
//把属性数组添加到元素中
elements.Add(new XElement(type.Name, attributes));
}
//初始化根元素,并把元素数组作为根元素的子元素,返回根元素的字符串格式(XML)
return new XElement("Root", elements).ToString();
} /// <summary>
/// 人类(测试数据类)
/// </summary>
class Person
{
/// <summary>
/// 名称
/// </summary>
public string Name { get; set; } /// <summary>
/// 年龄
/// </summary>
public int Age { get; set; }
}
}
}
把属性作为属性输出:
<Root>
<Person Name="李元芳" Age="23" />
<Person Name="狄仁杰" Age="32" />
</Root>
把属性作为子元素输出:
<Root>
<Person>
<Name>李元芳</Name>
<Age>23</Age>
</Person>
<Person>
<Name>狄仁杰</Name>
<Age>32</Age>
</Person>
</Root>
C#中利用LINQ to XML与反射把任意类型的泛型集合转换成XML格式字符串的更多相关文章
- C#中把任意类型的泛型集合转换成SQLXML数据格式的小例子
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- android XMl 解析神奇xstream 五: 把复杂对象转换成 xml ,并写入SD卡中的xml文件
前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...
- android XMl 解析神奇xstream 三: 把复杂对象转换成 xml
前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...
- Java对象转换成xml对象和Java对象转换成JSON对象
1.把Java对象转换成JSON对象 apache提供的json-lib小工具,它可以方便的使用Java语言来创建JSON字符串.也可以把JavaBean转换成JSON字符串. json-lib的核心 ...
- 怎样用Google APIs和Google的应用系统进行集成(8)----怎样把Google Blogger(博客)的JSON Schema转换成XML的Schema(XSD)?
在Google RESTFul API中,Google Blogger API(Google博客API)应该和我们的生活离得近期:由于差点儿非常多人每天都在看博客,都在写博客,都听说过博客.在前面的G ...
- C#中对象,字符串,dataTable、DataReader、DataSet,对象集合转换成Json字符串方法。
C#中对象,字符串,dataTable.DataReader.DataSet,对象集合转换成Json字符串方法. public class ConvertJson { #region 私有方法 /// ...
- 在一般处理程序中,把Form Post过来的表单集合转换成对象 ,仿 MVC post,反射原理
using System; using System.Collections.Generic; using System.Collections.Specialized; using System.L ...
- Python3 将configparser从ini文件中读取的内容转换成字典格式
因为写脚本的用到了,所以研究了下怎么将configparser从ini文件中读取的内容转换成字典格式. 整理一下,希望能对大家有帮助. 从http://stackoverflow.com/questi ...
- js中时间戳转换成时间格式
js中时间戳转换成时间格式, // 时间戳转换成时间格式 var formatDate = function(date){ date = new Date(date); var y=date.getF ...
随机推荐
- MSYS2环境搭建
本机环境:Windows XP 32位MSYS2地址:http://sourceforge.net/projects/msys2/ 下载32位版本,地址:http://sourceforge.net/ ...
- ES6中的新特性
本人最近学习es6一些方法,难免有些手痒,想着能不能将这些方法总结下,如下 1.数组的扩展 1)首先什么是伪数组 无法直接调用数组方法或期望length属性有什么特殊的行为,但仍可以对真正数组遍历方法 ...
- supervisor 管理
Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启.它是通过fork/exec的方式把这些被管理的进程 ...
- 第四章 Kubernetes 架构
4.1 Master节点:Master是大脑,运行如下Daemon服务: API Server(kube-apiserver) API server提供了HTTP/HTTPS RESTful ...
- python 3389爆破机
前言: = =上学后的第一个星期假期,写了个3389爆破器 - 0x01 准备: hydra 钟馗之眼API 0x02代码: import optparse import os import requ ...
- 热门数据挖掘模型应用入门(一): LASSO回归
热门数据挖掘模型应用入门(一): LASSO回归 2016-10-10 20:46 作者简介: 侯澄钧,毕业于俄亥俄州立大学运筹学博士项目, 目前在美国从事个人保险产品(Personal Line)相 ...
- python3.5+flask+mysql
该篇博客配置环境为:python版本3.5,flask2.0,python3中已经不再支持MySQLdb模块,所有这里我用了pymysql,所有使用前应该 安装pymysql:pip install ...
- 关于windows系统里locale、code page、ANSI编码的问题
最近把公司代码库里的代码同步下来之后编译了下,竟然出问题.问下同事说代码库肯定没问题,而我啥也没改,那到底那里出问题了呢? VS2018报的错误是:error RC2001: newline in c ...
- Mysql 日志文件类型
简介: Mysql 中提供了多种类型的日志文件,分别反映 Mysql 的不同信息,了解它们很有必要. 1.Error log ( 错误日志 ) 错误日志记录了 Mysql Server 运行过程中所有 ...
- NPM设置代理
npm获取配置有6种方式,优先级由高到底. 命令行参数. --proxy http://server:port即将proxy的值设为http://server:port. 环境变量. 以npm_con ...