将单个XElement转换为对象
本文关键字:对象 转换 XElement 单个 | 更新日期: 2023-09-27 18:30:10
我有一个XElement
,如下所示:
<row flag="1" sect="" header="" body="" extrainfo="0" />
然后我有一个类看起来像这样:
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(
"<row flag='1' sect='3' header='4444' body='3434' extrainfo='0' />");
//StringReader reader = new StringReader(
//"<row flag='1' sect='3' header='4444' body='3434' extrainfo='0' />");
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);
如果你想使其动态化,你可以使用反射获取类上的属性,然后循环,然后在XElement中搜索该属性,然后以同样的方式设置该属性。然而,我会保持简单,因为对象并不复杂。
这看起来相当容易(至少没有错误检查…):
var res = new ProdicAttribute {
Flag = (string)element.Attribute("flag"),
Sect = (string)element.Attribute("sect"),
...
}
var element = XElement.Parse("<row flag="1" sect="" header="" body="" extrainfo="0" />");
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
。