如何在c#中将XML加载到通用列表对象?

用户名

我有一个“学校”类,其中已将“学生”类与“名称”嵌套为“学生”的属性。

public class school
{
    private List<student> mystudents;

    public class student
    {
        private string name;
    }
}

一所学校有很多学生,每个学生都有一个名字。

我有一个XML文档:

 <school>
    <student>
        <name>John</name>
    </student>
    <student>
        <name>Jane</name>
    </student>
    <student>
        <name>Jack</name>
    </student>
 </school>

可以说,我创建了一个学校对象,并且想将此xml读取到学校对象中,我该怎么做?我已经编写了用于将XML读取到对象中,递归地将值复制到所有属性的工作代码。我不知道如何针对List<T>通用列表进行这项工作

以下是我的代码,用于递归读取XML到通用对象:

  /*----------------------------------------------------------------
    ' Template to read XML document into a Objects
    '-----------------------------------------------------------------*/
    public static T XmlToObject<T>(string fileName, T obj)
    {

        // read XML
        string xmlString = File.ReadAllText(fileName);
        XmlDocument xmlDocument = new XmlDocument();
        xmlDocument.LoadXml(xmlString);

        // read the root node
        XmlNode groupsListNode = xmlDocument.GetElementsByTagName(obj.GetType().Name).Item(0);

        // iterate through and copy values
        XmlNodeToListProperties(groupsListNode, obj);

        return obj;
    }

 public static void XmlNodeToProperties( XmlNode listNode, object obj)
    {
        //iterate through properties of object and copy from listNode
        foreach(var prop in obj.GetType().GetProperties())
        {
            if (listNode[prop.Name] != null)
            {
                if (listNode[prop.Name].ChildNodes.Count > 1) // has child-properties
                {
                    // call recursively
                    XmlNodeToProperties(listNode[prop.Name], prop.GetValue(obj, null));
                }
                else // no child properties
                {
                    // get proprty type
                    Type t = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType;

                    // convert listNode.FirstChild.value to PropertyType
                    object safeValue = CustomConvert( listNode[prop.Name], t) ;
                    // store in object
                    prop.SetValue(obj, safeValue, null);
                }
            }

我确实考虑过使用,serializers但是问题是xmlElement("name")每个属性都需要它我的一些对象/类来自第三方API,我无权编辑其类文件以插入`xmlElement(“ name”)。关于修改/更改上述通用模板以适应通用列表的任何建议?

卢塞罗

你为什么用GetElementsByTagName您是否知道这实际上可以获取给定类型的所有后代?

如果要“反序列化”整个对象树,则应从根开始并逐步进行。您需要能够将新实例追加到列表/集合/数组,或追加到实例中为空的对象属性obj

您正在谈论第三方对象。那就是通常很难做到的地方。根据API的不同,您需要调用某些工厂,父方法或构造函数。如果是构造函数,那么如果需要参数(例如所有者/父对象)怎么办?

必须有一个严格的约定/定义,因为要使其正常工作,必须执行此操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在mono中将dll加载到C#并运行它

如何在c#中返回带有通用类对象的通用列表?

如何在 C++/winrt 中将 svg 加载到 CanvasVirtualControl?

如何在C#中将MongoDB文档数据分配到通用列表中?

如何在C#中将项目添加到通用列表

如何在Spring中将文件夹的所有文件加载到资源列表中?

如何在C#中将列表添加到匿名对象?

如何在c#中将xml反序列化为列表

如何在C#中将xml对象映射到list <elements>中?

如何在C#中将xml反序列化为对象

如何在C#中克隆通用列表?

如何在C#中创建未知/通用类型的列表?

如何在C#中使单个链接列表通用

如何在 C# 中组合通用函数的列表?

如何在C#中传递和使用通用对象?

如何在Java中将通用列表转换为通用数组?

如何在C#中将对象列表中的值分配给另一个列表

在C#中将表单的控件加载到面板

如何在iOS中将FilePath加载到UIWebbview中?

如何在WPF中将图像加载到图像控件?

如何在python中将字典加载到nparray中

如何在javascript中将数据加载到特定的输入值?

如何在Matlab中将Mat文件加载到矩阵中

如何在Android中将JSON数据加载到片段中

如何在Perl中将文件加载到内存中

如何在Julia中将多个CSV加载到DataFrames中?

如何在c#中使用XElement生成对象列表的xml

如何在 C# 中将结构列表写入文件?

如何在C#中将枚举转换为列表?