C# 如何在没有容器的情况下反序列化c中的2个子元素#
我有以下xml,并且需要对其进行反序列化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>
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;}
}
我添加了两个属性,它们返回列表中每种类型对象的过滤枚举