Unable to deserialize XML string

I have the following xml which I am trying to deserialize as follows, but I am getting an error:

An error occurred reflecting the type "System.Collections.Generic.List`1 [MyApp.Models.Field]

Below is my code

public class FieldList
{
    [XmlArray("fields")]
    [XmlArrayItem("field")]
    List<Field> Fields { get; set; }
}

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

    [XmlAttribute("required")]
    public bool Required { get; set; }

    [XmlAttribute("label")]
    public string Label { get; set; }

    [XmlAttribute("name")]
    public string Name { get; set; }

    [XmlElement("option")]
    [JsonProperty("values")]
    public List<Option> Options { get; set; }
}

public class Option
{
    [XmlAttribute("label")]
    public string Label { get; set; }

    [XmlAttribute("value")]
    public string Value { get; set; }

    [XmlAttribute("selected")]
    public bool Selected { get; set; }

    /// <remarks/>
    [XmlIgnore()]
    public bool SelectedSpecified { get; set; }

    [XmlText]
    public string Text { get; set; }
}

var xml =  @"<?xml version=""1.0"" ?>
   <form-template>
    <fields>
        <field type=""select"" required=""true"" label=""Cars"" name=""cars"" >
            <option label=""Toyota"" value=""Toyota"" selected=""true"">Toyota</option>
            <option label=""Nisan"" value=""Nisan"" >Nisan</option>
        </field>
    </fields>
   </form-template>";


 var serializer = new XmlSerializer(typeof(FieldList), new XmlRootAttribute("form-template"));
 var stringReader = new StringReader(xml);
 var xmlFields = (FieldList)serializer.Deserialize(stringReader);

What am I doing wrong?

* UPDATE *

According to the comments below, changing

 public IEnumerable<Option> Options { get; set; }

For

  public List<Option> Options { get; set; }

corrects the error, but now nothing is deserialized - the variable is xmlFieldsempty ??? Do I need to read from a specific node or not?

+4
source share
3 answers

Look at your code.

new XmlRootAttribute("form-template")mapped to <form-template>node.

public class Fieldmapped to <fieldnode.

But nothing is displayed on <fields>node.

Add the following class:

public class FieldList
{
    [XmlArray("fields")]
    [XmlArrayItem("field")]
    public List<Field> Fields { get; set; }
}

It should work:

var serializer = new XmlSerializer(typeof(FieldList), new XmlRootAttribute("form-template"));
var stringReader = new StringReader(xml);
var xmlFields = (FieldList)serializer.Deserialize(stringReader);

, Option:

[XmlText]
public string Text { get; set; }

Update.

FieldList. xml.

List<Field> xmlFields;
var serializer = new XmlSerializer(typeof(List<Field>), new XmlRootAttribute("fields"));

// You can read from a stream or from a StringReader instead of a file
using (var xmlReader = XmlReader.Create("test.xml"))
{
    // Skip <form-template> node
    xmlReader.ReadToFollowing("fields");

    xmlFields = (List<Field>)serializer.Deserialize(xmlReader);
}

XmlType :

[XmlType("field")]
public class Field
+2

XmlSerializer , , , IEnumerable List, ,

public IEnumerable<Option> Options { get; set; }

to

public List<Option> Options { get; set; }

XML. XML, ,

var xml = "<?xml version=\"1.0\" ?>" +
                    "  " +
                    "    <Fields>" +
                    "        <Field Type=\"select\" Required=\"true\" Label=\"Cars\" Name=\"cars\" >" +
                    "            <option label=\"Toyota\" lalue=\"Toyota\" selected=\"true\">Toyota</option>" +
                    "            <option label=\"Nisan\" value=\"Nisan\" >Nisan</option>" +
                    "        </Field>" +
                    "    </Fields>";

,

XmlSerializer serializer = new XmlSerializer(typeof(List<Field>), new XmlRootAttribute("Fields"));

    var stringReader = new StringReader(xml);
        List<Field> xmlFields = (List<Field>)serializer.Deserialize(stringReader);

. . ,

enter image description here

+3

, xml. XML " " , cs Visual Studio. - > - > XML . cs. , .

XmlSerializer serializer = new XmlSerializer(typeof(FormTemplate));
            var xml = @"<?xml version=""1.0"" ?>
   <form-template>
    <fields>
        <field type=""select"" required=""true"" label=""Cars"" name=""cars"" >
            <option label=""Toyota"" value=""Toyota"" selected=""true"">Toyota</option>
            <option label=""Nisan"" value=""Nisan"" >Nisan</option>
        </field>
    </fields>
   </form-template>";
            var stringReader = new StringReader(xml);
            var xmlFields = serializer.Deserialize(stringReader);

. , .

/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute("form-template", Namespace = "", IsNullable = false)]
public partial class FormTemplate
{
    /// <remarks/>
    public Fields fields { get; set; }
}

/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class Fields
{
    /// <remarks/>
    public SingleField field { get; set; }
}

/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class SingleField
{
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("option")]
    public Option[] option { get; set; }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string type { get; set; }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public bool required { get; set; }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string label { get; set; }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string name { get; set; }
  }

/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class Option
{
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string label { get; set; }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string value { get; set; }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public bool selected { get; set; }

    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool selectedSpecified { get; set; }

    /// <remarks/>
    [System.Xml.Serialization.XmlTextAttribute()]
    public string Value { get; set; }

}
+1

Source: https://habr.com/ru/post/1687623/


All Articles