C# 反序列化一个对象中的多个XML元素

C# 反序列化一个对象中的多个XML元素,c#,xml,serialization,xmlreader,C#,Xml,Serialization,Xmlreader,我正在使用XmlSeriazlier对xml文件进行反序列化 var serializer = new XmlSerializer(typeof(T)); using (var reader = document.CreateReader()) var result = (T)serializer.Deserialize(reader); Xml包含需要一起存储在一个对象中的if/else if/else条件 示例Xml <Layers> <If if="somet

我正在使用XmlSeriazlier对xml文件进行反序列化

var serializer = new XmlSerializer(typeof(T));
using (var reader = document.CreateReader())
   var result = (T)serializer.Deserialize(reader);
Xml包含需要一起存储在一个对象中的if/else if/else条件

示例Xml

<Layers>
  <If if="something" >
    <Layer name="something" />
  </If>
  <ElseIf if="anything" >
    <Layer name="anything" />
  </ElseIf>
  <Else>
    <Layer name="nothing" />
  </Else>

  <If if="something" >
    <Layer name="something" />
  </If>
  <ElseIf if="anything" >
    <Layer name="anything" />
  </ElseIf>

  <If if="something" >
    <Layer name="something" />
  </If>
  <Else>
    <Layer name="nothing" />
  </Else>
</Layers>

语法与编程语言相同。我想知道如何将连接的条件存储在一起

[XmlRoot("Layers")
public class Layers
{
    // TODO: Parse conditions to this list.
    public List<Condition> { get; set; }
}

public class Condition
{
    public If IfCondition { get; set; }
    public List<IfElse> IfElseConditions { get; set; }
    public Else ElseCondition { get; set; }
}
[XmlRoot(“层”)
公共类层
{
//TODO:将条件解析到此列表。
公共列表{get;set;}
}
公共阶级状况
{
如果条件{get;set;}为公共
公共列表IfElseConditions{get;set;}
公共Else ElseCondition{get;set;}
}

选择xml模式存在一些重大问题,这使得它不是
XmlSerializer
的好选择。具体来说,没有概念上的
(或类似),这意味着从序列化程序的角度来看,没有任何东西可以对这些条件进行分组。要捕获数据,您需要:

[XmlRoot(“层”)
公共类层
{
[XmlElement(“如果”)]
public List{get;set;}//您可以在此处共享内部类型
[xmlement(“ElseIf”)]
公共列表{get;set;}
[XmlElement(“Else”)]
公共列表{get;set;}
}
但是现在你不知道哪个if元素和哪个else if元素一起,也不知道和哪个else元素一起

我怀疑您必须手动实现这一点,在节点类型之间更改时添加您自己的逻辑,但这并不简单。坦率地说,如果可能的话,重新考虑xml布局可能会更容易!例如:


选择xml模式存在一些重大问题,这使得它不是
XmlSerializer
的好选择。具体来说,没有概念上的
(或类似),这意味着从序列化程序的角度来看,没有任何东西可以对这些条件进行分组。要捕获数据,您需要:

[XmlRoot(“层”)
公共类层
{
[XmlElement(“如果”)]
public List{get;set;}//您可以在此处共享内部类型
[xmlement(“ElseIf”)]
公共列表{get;set;}
[XmlElement(“Else”)]
公共列表{get;set;}
}
但是现在你不知道哪个if元素和哪个else if元素一起,也不知道和哪个else元素一起

我怀疑您必须手动实现这一点,在节点类型之间更改时添加您自己的逻辑,但这并不简单。坦率地说,如果可能的话,重新考虑xml布局可能会更容易!例如: