4

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

例如,如果我有:

<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 文档的某种层次结构,然后根据它们的类型从这些对象中提取数据以放入我的数据库中。有没有办法/更好的方法来做到这一点?

4

2 回答 2

8

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

 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-使用ExpandoOb 来自XML 的动态对象

于 2012-11-12T23:46:19.710 回答
1

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

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

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

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

于 2012-11-12T23:56:21.687 回答