我正在使用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; }
}
选择xml模式存在一些重大问题,这使得它实际上不是XmlSerializer
的不错选择。具体来说,没有概念<Condition>
(或类似的概念),这意味着从序列化器的角度来看没有什么可以对这些条件进行分组。要捕获数据,您需要:
[XmlRoot("Layers")
public class Layers
{
[XmlElement("If")]
public List<If> { get; set; } // you may be able to share the inner type here
[XmlElement("ElseIf")]
public List<ElseIf> { get; set; }
[XmlElement("Else")]
public List<Else> { get; set; }
}
但现在您不知道哪些if元素与哪些else-if元素一起使用,以及与其他else元素一起使用。
我怀疑您必须手动实施此操作,在节点类型之间进行更改时添加自己的逻辑,但这并不简单。坦白说,如果可能的话,重新考虑xml布局可能会更容易!