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

时间:2012-11-12 23:33:04

标签: c# .net xml-parsing xml-serialization xml-deserialization

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

例如,如果我有:

<objecttype1>
    <attr1>Some string of text</attr1>
</objecttype1>
<objecttype1>
    <attr2>123456789</attr2>
</objecttype1>

我希望定义一个类似于以下内容的对象:

public class objecttype1 {
    public string attr1 {get; set;}
    public string attr2 {get; set;}
}

基本上,我想将整个xml文档反序列化为各种不同的对象,其中某种层次结构代表原始的xml文档,然后从这些对象中提取数据以根据其类型放入我的数据库。有没有办法/更好的方法来做到这一点?

2 个答案:

答案 0 :(得分:7)

您正在寻找ExpandoObject ExpandoObject是C#4中引入的动态对象 找到示例实现here

 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;
    }
}

更多链接:
http://www.codeproject.com/Tips/227139/Converting-XML-to-an-dynamic-object-using-ExpandoO
http://www.codeproject.com/Articles/461677/Creating-a-dynamic-object-from-XML-using-ExpandoOb

答案 1 :(得分:1)

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

动态对象进行反序列化的唯一方法是,您将最终拥有某种动态类型,只需拥有其中的所有属性。

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

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