C# 将通用XML反序列化为未定义的对象

C# 将通用XML反序列化为未定义的对象,c#,.net,xml-parsing,xml-serialization,xml-deserialization,C#,.net,Xml Parsing,Xml Serialization,Xml Deserialization,我有一个非常长、非常多样的XML文件,我正试图将其中的一部分存储到数据库中。现在,我不想通过手工编写10000个不同的对象来存储反序列化的数据。有没有办法根据XML文件中的内容定义对象 例如,如果我有: 一些文本字符串 123456789 我希望定义一个类似于以下内容的对象: public class objecttype1 { public string attr1 {get; set;} public string attr2 {get; set;} } 基本上,我希望

我有一个非常长、非常多样的XML文件,我正试图将其中的一部分存储到数据库中。现在,我不想通过手工编写10000个不同的对象来存储反序列化的数据。有没有办法根据XML文件中的内容定义对象

例如,如果我有:


一些文本字符串
123456789
我希望定义一个类似于以下内容的对象:

public class objecttype1 {
    public string attr1 {get; set;}
    public string attr2 {get; set;}
}
基本上,我希望将整个xml文档反序列化为各种不同的对象,这些对象具有某种表示原始xml文档的层次结构,然后从这些对象中提取数据,根据它们的类型放入数据库。有什么方法/更好的方法吗?

您正在寻找一个。
ExpandoObject是C#4中引入的动态对象。
发现的示例实现:

public静态IEnumerable GetExpandoFromXml(字符串文件,字符串下降)
{
var expandoFromXml=新列表();
var doc=XDocument.Load(文件);
var节点=doc.Root.subjects(degrandAnti);
foreach(doc.Root.substands(degrandAnti)中的var元素)
{
动态expandoObject=新的expandoObject();
var dictionary=expandooobject作为IDictionary;
foreach(元素中的var子元素。子元素()
{
if(child.Name.Namespace==“”)
字典[child.Name.ToString()]=child.Value.Trim();
}
收益率目标;
}
}
更多链接:


简言之,无法将XML中的类型反序列化为由XML内容命名的具体类型。为了能够将xml反序列化为给定的具体类型,必须在代码中定义该类型。或者可能具有不同的类型结构,其中将定义TypeName(从创建它的位置,即xml中的标记名)

对动态对象进行反序列化的唯一好处是,最终会得到某种动态类型,其中包含所有属性

如果要将XML保存到数据库中,我不会将其反序列化为动态对象。相反,我将使用XML文档对象模型(XmlDocument?)来读取并保存到数据库中。否则,您将得到具有所有字符串属性的对象,然后保存它们。似乎只是反序列化为对象的多余步骤


此外,反序列化为动态对象(如答案所示)不会给您提供不同类型的对象(至少不会与XML中的那些类型一起)。

同意(+1),但如果要将XML保存到数据库中,我不会将其反序列化为动态对象。相反,我将使用XML文档对象模型(XmlDocument?)来读取并保存到数据库中。否则,您将得到具有所有字符串属性的对象,然后保存它们。似乎只是一个多余的步骤反序列化成对象。我已经编辑了你的标题。请参阅“”,其中的共识是“不,他们不应该”。
 public static IEnumerable<dynamic> GetExpandoFromXml(string file, string descendantid)
{
    var expandoFromXml = new List<dynamic>();

    var doc = XDocument.Load(file);
    var nodes = doc.Root.Descendants(descendantid);

    foreach (var element in doc.Root.Descendants(descendantid))
    {
        dynamic expandoObject = new ExpandoObject();
        var dictionary = expandoObject as IDictionary<string, object>;
        foreach (var child in element.Descendants())
        {
            if (child.Name.Namespace == "")
                dictionary[child.Name.ToString()] = child.Value.Trim();
        }
        yield return expandoObject;
    }
}