2017-08-25 4 views
0

Ich mache ein C# -Projekt und ich habe ein Objekt in XML kodiert; ein Beispiel Beispiel wäre:Wie Sie XML-Attribute und -Arrays richtig deserialisieren?

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Entity Type="StartRunTestSetResponse"> 
    <Fields> 
     <Field Name="SuccessStaus"> 
      <Value>2</Value> 
     </Field> 
     <Field Name="info"> 
      <Value></Value> 
     </Field> 
    </Fields> 
</Entity> 

ich das Attribut Informationen benötigen, weil es eine Notwendigkeit in der Schlüsselwertpaars hat das Objekt ist.

Meine Deserialisierung Grammatik sieht wie folgt aus:

[DataContract(Name="Entity", Namespace="")] 
[XmlSerializerFormat] 
[KnownType(typeof(SRTSRField))] 
[KnownType(typeof(SRTSRValue))] 
public class StartRunTestSetResponse 
{ 
    [DataMember(Name="Type"), XmlAttribute("Type")] 
    public string type { get; set; } 

    [DataMember(Name = "Fields", IsRequired = true), XmlElement("Fields")] 
    public List<SRTSRField> fields { get; set; } 

    internal StartRunTestSetResponse() { fields = new List<SRTSRField>(); } 
} 
[DataContract(Name = "Field", Namespace = "")] 
[KnownType(typeof(SRTSRValue))] 
public class SRTSRField 
{ 
    [DataMember(Name = "Name"), XmlAttribute("Name")] 
    public string name {get; set;} 

    [DataMember(Name = "Value"), XmlElement("Value")] 
    public SRTSRValue value { get; set; } 
} 
[DataContract(Name = "Value", Namespace = "")] 
public class SRTSRValue 
{ 
    [DataMember, XmlText] 
    public string value { get; set; } 
} 

Nun ist es nicht funktioniert; Im Moment analysiert es das Fields Element und dann jedes Kind davon ist null.

Antwort

1

Sie Ihr Modell

public class Entity 
{ 
    [XmlAttribute] 
    public string Type { get; set; } 
    [XmlArrayItem("Field")] 
    public Field[] Fields { get; set; } 
} 

public class Field 
{ 
    [XmlAttribute] 
    public string Name { get; set; } 
    public string Value { get; set; } 
} 
vereinfachen

So würde Deserialisierung

XmlSerializer ser = new XmlSerializer(typeof(Entity)); 
using (StringReader sr = new StringReader(xmlstring)) 
{ 
    var entity = (Entity)ser.Deserialize(sr); 

} 
+0

Nun, ich benutze nie wieder DataContract für XML! – Olivier10178

0
[XmlRoot(ElementName="Field")] 
public class Field { 
    [XmlElement(ElementName="Value")] 
    public string Value { get; set; } 
    [XmlAttribute(AttributeName="Name")] 
    public string Name { get; set; } 
} 

[XmlRoot(ElementName="Fields")] 
public class Fields { 
    [XmlElement(ElementName="Field")] 
    public List<Field> Field { get; set; } 
} 

[XmlRoot(ElementName="Entity")] 
public class Entity { 
    [XmlElement(ElementName="Fields")] 
    public Fields Fields { get; set; } 
    [XmlAttribute(AttributeName="Type")] 
    public string Type { get; set; } 
} 

Createdy von: http://xmltocsharp.azurewebsites.net/ Es ist wirklich nützlich

0

sein würde ich ein Wörterbuch mit xml Linq erstellen .

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication74 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 

      Dictionary<string,int?> dict1 = doc.Descendants("Field") 
       .GroupBy(x => (string)x.Attribute("Name"), y => string.IsNullOrEmpty((string)y.Element("Value")) ? null : (int?)y.Element("Value")) 
       .ToDictionary(x => x.Key, y => y.FirstOrDefault()); 


     } 

    } 



} 
Verwandte Themen