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

问题描述 投票:1回答:1

我正在使用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; }
}
c# xml serialization xmlreader
1个回答
0
投票

选择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布局可能会更容易!

© www.soinside.com 2019 - 2024. All rights reserved.