Преобразование одного объекта 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.