C# 如何在没有容器的情况下反序列化c中的2个子元素#

C# 如何在没有容器的情况下反序列化c中的2个子元素#,c#,xml,xml-serialization,xmlserializer,C#,Xml,Xml Serialization,Xmlserializer,我有以下xml,并且需要对其进行反序列化 LockerBank xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <ColumnList> <LockersColumn newPage="false"> <LockersList> <LockerInfo>

我有以下xml,并且需要对其进行反序列化

LockerBank xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ColumnList>
    <LockersColumn newPage="false">
      <LockersList>
        <LockerInfo>
          <Name>D08.001</Name>
          <Size>Medium</Size>
          <State>Available</State>
          <Terminal>false</Terminal>
        </LockerInfo>
        <LockerInfo>
          <Name>D08.002</Name>
          <Size>Medium</Size>
          <State>Available</State>
          <Terminal>false</Terminal>
        </LockerInfo>
        <LockerInfo>
          <Name>D08.003</Name>
          <Size>Medium</Size>
          <State>Available</State>
          <Terminal>false</Terminal>
        </LockerInfo>
      </LockersList>
      <Width>0</Width>
    </LockersColumn>
    <Section name="A">
      <LockersColumn newPage="false">
        <LockersList>
          <LockerInfo>
            <Name>D08.001</Name>
            <Size>Medium</Size>
            <State>Available</State>
            <Terminal>false</Terminal>
          </LockerInfo>
          <LockerInfo>
            <Name>D08.002</Name>
            <Size>Medium</Size>
            <State>Available</State>
            <Terminal>false</Terminal>
          </LockerInfo>
          <LockerInfo>
            <Name>D08.003</Name>
            <Size>Medium</Size>
            <State>Available</State>
            <Terminal>false</Terminal>
          </LockerInfo>
        </LockersList>
        <Width>0</Width>
      </LockersColumn>
      <LockersColumn newPage="false">
        <LockersList>
          <LockerInfo>
            <Name>D08.004</Name>
            <Size>Medium</Size>
            <State>Available</State>
            <Terminal>false</Terminal>
          </LockerInfo>
          <LockerInfo>
            <Name>D08.005</Name>
            <Size>Medium</Size>
            <State>Available</State>
            <Terminal>false</Terminal>
          </LockerInfo>
          <LockerInfo>
            <Name>D08.006</Name>
            <Size>Medium</Size>
            <State>Available</State>
            <Terminal>false</Terminal>
          </LockerInfo>
        </LockersList>
        <Width>0</Width>
      </LockersColumn>
    </Section>
</ColumnList>

</LockerBank>
LockerBank xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance“xmlns:xsd=”http://www.w3.org/2001/XMLSchema">
D08.001
中等的
可获得的
错误的
D08.002
中等的
可获得的
错误的
D08.003
中等的
可获得的
错误的
0
D08.001
中等的
可获得的
错误的
D08.002
中等的
可获得的
错误的
D08.003
中等的
可获得的
错误的
0
D08.004
中等的
可获得的
错误的
D08.005
中等的
可获得的
错误的
D08.006
中等的
可获得的
错误的
0
我想反序列化如下

 [XmlRoot("LockerBank")]
public class TestBank
{
    public TestBank()
    {
        TerminalSize = 4;
    }

    [XmlArray(ElementName = "ColumnList")]
    [XmlArrayItem(Type = typeof(LockerColumnLayout), ElementName = "LockersColumn", IsNullable = true)]

    public List<LockerColumnLayout> Columns { get; set; }

    [XmlArray(ElementName = "ColumnList")]
    [XmlArrayItem(Type = typeof(SectionLayout), ElementName = "Section", IsNullable = true)]
    public SectionLayout[] SectionCollection { get; set; }

    [XmlAttribute("TerminalSize")]
    public int TerminalSize { get; set; }
}
    public class SectionLayout
{
    [XmlAttribute("name")]
    public string Name { get; set; }

    [XmlElement(Type = typeof(LockerColumnLayout), ElementName = "LockersColumn")]
    public LockerColumnLayout[] LockersColumn { get; set; }

}

public class LockerColumnLayout
{
    [XmlArray(ElementName = "LockersList"),
    XmlArrayItem(Type = typeof(LockerLayout), ElementName = "LockerInfo")]
    public LockerLayout[] Lockers { get; set; }

    [XmlAttribute("newPage")]
    public bool NewPage { get; set; }
}

public class LockerLayout
{
    public LockerLayout()
    {
        ColumnSpan = LockerSize.U1;
    }

    public string Name { get; set; }

    public LockerSize Size { get; set; }

    public LockerSize ColumnSpan { get; set; }

    [XmlIgnore]
    public bool IsTerminal
    {
        get
        {
            return this.Size == LockerSize.Terminal;
        }
    }

}
[XmlRoot(“LockerBank”)]
公共类测试库
{
公共测试银行()
{
终端尺寸=4;
}
[XmlArray(ElementName=“ColumnList”)]
[XmlArrayItem(Type=typeof(LockerColumnLayout),ElementName=“LockerColumn”,IsNullable=true)]
公共列表列{get;set;}
[XmlArray(ElementName=“ColumnList”)]
[XmlArrayItem(Type=typeof(SectionLayout),ElementName=“Section”,IsNullable=true)]
公共SectionLayout[]SectionCollection{get;set;}
[XmlAttribute(“TerminalSize”)]
公共int TerminalSize{get;set;}
}
公共课分区布局
{
[XmlAttribute(“名称”)]
公共字符串名称{get;set;}
[xmlement(Type=typeof(LockerColumnLayout),ElementName=“LockerColumn”)]
public LockerColumnLayout[]LockerColumn{get;set;}
}
公共类锁柱布局
{
[XmlArray(ElementName=“LockersList”),
XmlArrayItem(Type=typeof(LockerLayout),ElementName=“LockerInfo”)]
公共储物柜布局[]储物柜{get;set;}
[XmlAttribute(“新页面”)]
公共bool NewPage{get;set;}
}
公共舱室布局
{
公共储物柜布局()
{
ColumnSpan=LockerSize.U1;
}
公共字符串名称{get;set;}
公钥大小{get;set;}
public lockerize列span{get;set;}
[XmlIgnore]
公共学校
{
收到
{
返回此.Size==LockerSize.Terminal;
}
}
}
我收到一个错误,提示“{”来自命名空间“”的XML元素“ColumnList”已存在于当前作用域中。请使用XML属性为该元素指定另一个XML名称或命名空间。“}”

如何反序列化它?

可以包含混合在一起的类型为
的多个子元素,因此需要将其反序列化为共享基类的多态数组——在本例中为
对象

[XmlRoot("LockerBank")]
public class TestBank
{
    public TestBank()
    {
        TerminalSize = 4;
    }

    [XmlArray(ElementName = "ColumnList")]
    [XmlArrayItem(Type = typeof(LockerColumnLayout), ElementName = "LockersColumn", IsNullable = true)]
    [XmlArrayItem(Type = typeof(SectionLayout), ElementName = "Section", IsNullable = true)]
    public List<object> LockerAndSectionLayouts { get; set; }

    [XmlIgnore]
    public IEnumerable<LockerColumnLayout> Columns { get { return (LockerAndSectionLayouts ?? Enumerable.Empty<object>()).OfType<LockerColumnLayout>(); } }

    [XmlIgnore]
    public IEnumerable<SectionLayout> SectionCollection { get { return (LockerAndSectionLayouts ?? Enumerable.Empty<object>()).OfType<SectionLayout>(); } }

    [XmlAttribute("TerminalSize")]
    public int TerminalSize { get; set; }
}
[XmlRoot(“LockerBank”)]
公共类测试库
{
公共测试银行()
{
终端尺寸=4;
}
[XmlArray(ElementName=“ColumnList”)]
[XmlArrayItem(Type=typeof(LockerColumnLayout),ElementName=“LockerColumn”,IsNullable=true)]
[XmlArrayItem(Type=typeof(SectionLayout),ElementName=“Section”,IsNullable=true)]
公共列表锁和分区布局{get;set;}
[XmlIgnore]
公共IEnumerable列{get{return(LockerAndSectionLayouts??Enumerable.Empty())。of type();}
[XmlIgnore]
公共IEnumerable SectionCollection{get{return(LockerAndSectionLayouts??Enumerable.Empty())。of type();}
[XmlAttribute(“TerminalSize”)]
公共int TerminalSize{get;set;}
}
我添加了两个属性,它们返回列表中每种类型对象的过滤枚举