C#中利用LINQ to XML与反射把任意类型的泛型集合转换成XML格式字符串的方法
作者:弎吩锺熱℃ 发布时间:2022-02-12 23:04:39
标签:C#,泛型集合,字符串
在工作中,如果需要跟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=23},
new Person(){Name="狄仁杰",Age=32}
};
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>


猜你喜欢
- 第一种,在配置文件配置在application.xml直接配置,这种方式是全局配置,所有返回给前端对象的属性为null或"&quo
- 🍊一. 为什么需要线程通信线程是并发并行的执行,表现出来是线程随机执行,但是我们在实际应用中对线程的执行顺序是有要求的,这就需要用到线程通信
- Android USB转串口通信开发实例详解好久没有写文章了,年前公司新开了一个项目,是和usb转串口通信相关的,需求是用安卓平
- TV 3D卡片无限循环效果,供大家参考,具体内容如下##前言1、需求:实现3个卡片实现无限循环效果:1-2-3-1-2-3-1…,而且要实现
- 目录效果图实现自定义软键盘1、通过xml定义键盘2、将xml文件与keyboardview绑定起来3、处理点击事件onKey附赠一些实用的效
- 在java中读取读取文件,经常因为路径的问题找不到,此文用于记录如何定位文件的简单方法。本基于springboot做的测试,主要是构建工程方
- C#中List<T>中泛型T如果是一个对象的话,则利用Find函数返回的将是这个对象的指针,对其返回对象的属性进行操作,也会影响
- 一、文件的编码package com.study.io;/*** 测试文件编码*/public class EncodeDemo {/***
- 本文实例为大家分享了java生成随机字符串的具体代码,供大家参考,具体内容如下import java.util.Random;public
- 一、前言最近在回顾数据结构与算法,有部分的算法题用到了栈的思想,说起栈又不得不说链表了。数组和链表都是线性存储结构的基础,栈和队列都是线性存
- 前言Spring框架对Bean进行装配提供了很灵活的方式,下面归纳一下主要的方式:在XML中进行显示配置在Java中进行显示配置隐式的bea
- Math.PI 记录的圆周率Math.E 记录e的常量Math中还有一些类似的常量,都是一些工程数学常用量。Math.ab
- 出处:https://www.cnblogs.com/SunSpringeclipse下面创建的Maven项目,使用mybatis。ecli
- ❤️大家好,我是贾斯汀,今天主要聊一聊关于线程的瓜!❤️先来看一下线程这张图线程的几种运行状态之间运行流程:看不懂没关系,慢慢来学习,往
- 如果运行react-native android项目出现如下错误:解决办法如下:一、执行adb devices,判断adb有没有断,二、如果
- 线程安全解决方案synchronized,ReentrantLock,Atomic 使用场景描述在实际开发过程中如果服务量,请求频繁,就会经
- 前言在前面的学习中,我们基本了解了一些 Canvas 的绘制,那么这一章我们一起复习一下图片的绘制几种方式,和事件的简单交互方式。我们从易到
- 本文实例讲述了如何计算(或者说,估算)一个Java对象占用的内存数量的方法。分享给大家供大家参考。具体分析如下:通常,我们谈论的堆内存使用的
- 目录一、单例模式饿汉模式懒汉模式懒汉模式二、堵塞队列实现BlockingQueue三、定时器总结一、单例模式单例模式是一种设计模式,针对一些
- 使用Android Studio 创建Android项目,分享给大家(1) 说明:还有一部分人在坚持使用 Eclipse ,建议抓紧换掉。使