Как десериализовать вложенный XML-файл в объект на C#

#c# #arrays #xml #serialization

#c# #массивы #xml #сериализация

Вопрос:

Я встретил очень сложную структуру XML, я думаю, что это похоже на вложенный 2D-массив. Но мое определение, похоже, не работает. У меня есть структура Xml, подобная приведенной ниже

 <Rate>
<GROUP>
    <GROUPNAME>Company</GROUPNAME>
    <COUNTY>Dawson</COUNTY>
</GROUP>
<EMPLOYEES>
    <MEMBERS>
        <MEMBER>
            <SEQUENCENUM>1</SEQUENCENUM>
            <GENDER>M</GENDER>
            <RELATIONSHIP>Father</RELATIONSHIP>
        </MEMBER>
        <MEMBER>
            <SEQUENCENUM>2</SEQUENCENUM>
            <GENDER>F</GENDER>
            <RELATIONSHIP>Mother</RELATIONSHIP>
        </MEMBER>
    </MEMBERS>
    <MEMBERS>
        <MEMBER>
            <SEQUENCENUM>1</SEQUENCENUM>
            <GENDER>M</GENDER>
            <RELATIONSHIP>Father</RELATIONSHIP>
        </MEMBER>
        <MEMBER>
            <SEQUENCENUM>2</SEQUENCENUM>
            <GENDER>Y</GENDER>
            <RELATIONSHIP>Mother</RELATIONSHIP>
        </MEMBER>
    </MEMBERS>
</EMPLOYEES>
  

И я определил три класса для этой структуры

 [XmlRoot("Rate")]
public class Rate
{
  [XmlElement("GROUP")]
  public GroupInfo Group{get; set;}

  [XmlArray("EMPLOYEES")]
  [XmlArrayItem("MEMBERS", typeof(Members))]
  public List<Members> Employees{get; set;}
}
  

И этот

 [XmlRoot("EMPLOYEES")]
public class Members
{
   [XmlArray("MEMBERS")]
   [XmlArrayItem("MEMBER", typeof(MemberInfo))]
   public List<MemberInfo> Members{get; set;}
}
  

И этот:

 [XmlRoot("Member")]
public class MemberInfo
{
    public string SequenceNum{get; set;}
    
    [XmlElement("GENDER")]
    public string Gender{get; set;}
    
    [XmlElement("RELATIONSHIP")]
    public string Relationship{get; set}
}
  

У вас, ребята, есть отличная идея для этого? Для этого вложенного массива?

Ответ №1:

Добавьте NestingLevel = 1 в свой XmlArrayItem атрибут.

Этот класс десериализует ваш XML.

 [Serializable]
[XmlType(AnonymousType = true)]
[XmlRoot(Namespace = "", IsNullable = false)]
public class Rate
{
    [XmlElement("GROUP")]
    public Group Group { get; set; }

    [XmlArrayItem("MEMBERS", IsNullable = false)]
    [XmlArrayItem("MEMBER", IsNullable = false, NestingLevel = 1)]
    public Member[][] EMPLOYEES { get; set; }
}

[XmlType(AnonymousType = true)]
public class Group
{
    [XmlElement("GROUPNAME")]
    public string Name { get; set; }

    [XmlElement("COUNTY")]
    public string Country { get; set; }
}

[XmlType(AnonymousType = true)]
public class Member
{
    [XmlElement("SEQUENCENUM")]
    public byte Sequencenum { get; set; }

    [XmlElement("GENDER")]
    public string Gender { get; set; }

    [XmlElement("RELATIONSHIP")]
    public string Relationship { get; set; }
}
  

Комментарии:

1. Спасибо, мистер Кофе, действительно отличные решения. Я просто добавляю еще один [XmlArrayItem (ElementName = "MEMBERS", NestedLevel = 0)] . Работает действительно отлично.