2013-09-04 1 views
12

У меня есть один 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 объект ?

ответ

13

Вы должны поставить правильный сериализации атрибуты вашего класса и класса членов

[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

Лучшее решение, если оно будет работать. Но я получаю: 'Атрибут System.Xml.Serialization.XmlElementAttribute недействителен для этого типа объявления. Он действителен только для объявлений 'Property, Field, Parameter, ReturnValue'. – Numm3n

+1

@ Numm3n Oups, должен быть XmlRoot отредактирован мой ответ – jbl

5

Вы пробовали:

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

Да, я пробовал, но я только получаю: ' не ожидалось.' – Numm3n

+0

Вы должны поместить правильные атрибуты сериализации в класс ProductAttribute. Как XmlElement для класса и XmlAttribute для каждого свойства. – Alberto

+0

Спасибо. Но мне не разрешено помещать '[XmlElement (" row ")]' в класс. 'Attribute System.Xml.Serialization.XmlElementAttribute недействителен для этого типа объявления. Он действителен только для объявлений 'Property, Field, Parameter, ReturnValue'. – Numm3n

1

Это кажется довольно легко (по крайней мере, без проверки ошибок ...):

var res = new ProdicAttribute { 
    Flag = (string)element.Attribute("flag"), 
    Sect = (string)element.Attribute("sect"), 
    ... 
} 
+0

Это ручное сопоставление. Но что, если у меня есть XElement с 200 атрибутами? Я надеялся, что у C# /. Net будет более простое решение. – Numm3n

+0

Правильное использование атрибутов сериализации XML является нетривиальным (и я нахожу его склонным к ошибкам) ​​... Я не вижу в этом больше работы. Плюс это помогает с разделением проблем :-). – Richard

0
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.

3

Я хотел бы добавить конструктор, который принимает в 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 тогда этот атрибут настройки, которые собственности так же. Однако я бы сохранил это просто, поскольку объект не является сложным.

7

Вы могли бы сделать так:

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); 

Надеюсь, это вам поможет.

 Смежные вопросы

  • Нет связанных вопросов^_^