将单个XElement转换为对象

我有一个XElement看起来像这样:

  

然后我有一个看起来像这样的课:

 public class ProductAttribute { public string Flag { get; set; } public string Sect { get; set; } public string Header { get; set; } public string Body { get; set; } public string Extrainfo { get; set; } } 

如何将此XElement转换为ProductAttribute对象?

您必须在类和类成员上放置正确的序列化属性

 [Serializable()] [XmlRoot(ElementName = "row")] public class ProductAttribute { [XmlAttribute("flag")] public string Flag { get; set; } [XmlAttribute("sect")] public string Sect { get; set; } [XmlAttribute("header")] public string Header { get; set; } [XmlAttribute("body")] public string Body { get; set; } [XmlAttribute("extrainfo")] public string Extrainfo { get; set; } } 

你可以这样做:

1)首先你应该给这个类赋予属性:

 [XmlRoot("row")] public class ProductAttribute { [XmlAttribute("flag")] public string Flag { get; set; } [XmlAttribute("sect")] public string Sect { get; set; } [XmlAttribute("header")] public string Header { get; set; } [XmlAttribute("body")] public string Body { get; set; } [XmlAttribute("extrainfo")] public string Extrainfo { get; set; } } 

2)现在您可以反序列化您的XElement或简单的xml字符串,如下所示:

 ProductAttribute productAttribute = new ProductAttribute(); XElement xElement = XElement.Parse( ""); //StringReader reader = new StringReader( //""); StringReader reader = new StringReader(xElement.ToString()); XmlSerializer xmlSerializer = new XmlSerializer(typeof(ProductAttribute)); productAttribute = (ProductAttribute)xmlSerializer.Deserialize(reader); 

我希望它对你有所帮助。

你有没有尝试过:

 XElement element = //Your XElement var serializer = new XmlSerializer(typeof(ProductAttribute)); (ProductAttribute)serializer.Deserialize(element.CreateReader()) 

我会添加一个接受XElement的构造函数。

 public class ProductAttribute { public string Flag { get; set; } public string Sect { get; set; } public string Header { get; set; } public string Body { get; set; } public string Extrainfo { get; set; } public ProductAttribute(XElement xElement){ Flag = (string)element.Attribute("flag"); Sect = (string)element.Attribute("sect").Value; Header = (string)element.Attribute("header ").Value; Body = (string)element.Attribute("body").Value; Extrainfo = (string)element.Attribute("extrainfo").Value; } } 

那你就可以打电话了

 var productAttribute = new ProductAttribute(element); 

如果你想创建动态,你可以使用reflection获取类上的属性然后循环然后搜索XElement以获取该属性,然后以相同的方式设置该属性。 但是我会保持简单,因为对象并不复杂。

这似乎相当容易(至少没有错误检查…):

 var res = new ProdicAttribute { Flag = (string)element.Attribute("flag"), Sect = (string)element.Attribute("sect"), ... } 
 var element = XElement.Parse(""); var productAttribute = new ProductAttribute { Flag = (string)element.Attribute("flag"), Sect = (string)element.Attribute("sect"), Header = (string)element.Attribute("header"), Body = (string)element.Attribute("body"), Extrainfo = (string)element.Attribute("extrainfo") }; 

但我认为不应将所有ProductAttribute类属性键入为string