2013-09-04 7 views
12

ich eine einzige XElement wie folgt aussehen zu widersetzen: Konvertieren einzelner XElement

<row flag="1" sect="" header="" body="" extrainfo="0" /> 

Dann

ich eine Klasse wie folgt aussehen:

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

Wie kann ich diese XElement in ein ProductAttribute Objekt konvertieren ?

Antwort

13

Sie haben die korrekte Serialisierung setzen Attribute auf Ihre Klasse und Klassenmitglieder

[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

Beste Lösung bisher, wenn es funktionieren würde. Aber ich bekomme: 'Attribut System.Xml.Serialization.XmlElementAttribute ist nicht gültig für diesen Deklarationstyp. Es ist gültig nur für 'Property, Field, Parameter, ReturnValue' Erklärungen – Numm3n

+1

@ Num3n Oups, sollte XmlRoot meine Antwort bearbeitet werden – jbl

5

Haben Sie versucht:

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

Ja, ich habe versucht, aber ich bekomme nur: ' Numm3n

1

Diese ziemlich einfach scheint (zumindest ohne Fehlerprüfung ...):

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

Dies ist ein manuelles Mapping. Was aber, wenn ich ein XElement mit 200 Attributen habe? Ich hatte gehofft, dass C#/.net eine einfachere Lösung haben würde – Numm3n

+0

Die XML-Serialisierungsattribute richtig zu bekommen ist nicht trivial (und ich finde es fehleranfällig) ... Ich sehe das nicht mehr als Arbeit. Außerdem hilft es bei der Trennung von Anliegen :-). – 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") 
}; 

Aber ich glaube nicht, alle ProductAttribute Klasseneigenschaften sollte als string eingegeben werden.

3

Ich würde einen Konstruktor hinzufügen, die in einem XElement nimmt.

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

Dann können Sie einfach

var productAttribute = new ProductAttribute(element); 

nennen Wenn Sie diese dynamische machen wollten Sie Reflexion erhalten die Eigenschaften auf der Klasse verwenden könnte dann Schleife über dann und die XElement der Suche nach, dass Attribut dann einstellen, dass Eigenschaft in der gleichen Weise. Ich würde es jedoch einfach halten, da das Objekt nicht komplex ist.

7

Sie auf diese Weise tun könnte:

1) Zunächst sollten Sie die Klasse geben Attribute:

[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) Jetzt können Sie Ihre XElement oder einfache XML-Zeichenfolge wie folgt deserialisieren:

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

Ich hoffe, es hilft Ihnen.