【问题标题】:How to deserialize nested XML file into object in C#如何将嵌套的 XML 文件反序列化为 C# 中的对象
【发布时间】:2020-12-14 19:23:41
【问题描述】:

我遇到了一个非常复杂的 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}
}

你们对此有什么好主意吗?对于这个嵌套数组?

【问题讨论】:

    标签: c# arrays xml serialization


    【解决方案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; }
    }
    

    【讨论】:

    • 谢谢 Mr.coffee 真的很棒的解决方案。我只是添加另一个[XmlArrayItem (ElementName = "MEMBERS", NestedLevel = 0)]。真的很棒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多