Преобразование одного объекта XElement в объект
У меня есть один 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
?
Ответы
Ответ 1
Вы должны поместить правильные атрибуты сериализации в свой класс и члены класса
[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; }
}
Ответ 2
Вы можете сделать так:
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);
Надеюсь, это поможет вам.
Ответ 3
Вы пробовали:
XElement element = //Your XElement
var serializer = new XmlSerializer(typeof(ProductAttribute));
(ProductAttribute)serializer.Deserialize(element.CreateReader())
Ответ 4
Я бы добавил конструктор, который принимает 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 для этого атрибута, а затем установить это свойство так же. Однако я бы сохранил это просто, поскольку объект не является сложным.
Ответ 5
Это выглядит довольно легко (по крайней мере, без проверки ошибок...):
var res = new ProdicAttribute {
Flag = (string)element.Attribute("flag"),
Sect = (string)element.Attribute("sect"),
...
}
Ответ 6
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
.