我有一个非常长的,非常多样的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文档,然后从这些对象中提取数据以根据其类型放入我的数据库。有没有办法/更好的方法来做到这一点?
答案 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中的那些类型)。