繁体   English   中英

如何将不同名称的 XML 节点反序列化为相同的基本类型

[英]How to Deseralize XML nodes of different names to same base type

我在网上找不到一个示例,该示例准确地解释了如何配置 XmlSerializer 以按照我想要的方式反序列化 XML。

我想将此 XML 反序列化为Fruits或至少List<Fruit>

<fruits>
  <apple>{fruitstuff}</apple>
  <orange>{fruitstuff}</orange>
  <pear>{fruitstuff}</pear>
<fruits>

我想象一个看起来像这样的 model

class Fruits : List<Fruit> {}

class Fruit {
  {fruitstuff}
}

class Apple : Fruit {}

class Orange : Fruit {}

class Pear : Fruit {}

我遇到的问题是 XmlSerlization 配置和 XML 属性的某种组合。 当我提供 XmlSeralizer 时,可以读取 XML 而不会引发错误,但是它不能识别水果的集合。 该集合将包含零个元素。

var seralizer = new XmlSerializer(typeof(Fruits), new XmlRootAttribute("Fruits"));

我对互联网的问题是,如何配置序列化程序以识别类似节点并将其反序列化为基本类型的集合?

我宁愿有一个精心配置的自定义序列化程序,而不是 XmlAttributed model。 我可能想使用除 XML 以外的其他格式的 model。 在我的 model 中使用 xml 属性我认为没有目标序列化实现那么优雅。

  1. 添加<fruit>元素以包装多个<fruits>元素
  2. XmlRootXmlElement属性添加到相应的类。

我的示例代码,它的工作原理:

class Program
{

    static void Main(string[] args)
    {
        string xml = @"
        <fruit>
            <fruits>
              <apple>
                 <attr1>1</attr1>
                 <attr2>2</attr2>
              </apple>
              <orange>
                 <attr1>3</attr1>
                 <attr2>4</attr2>
              </orange>
              <pear>
                 <attr1>5</attr1>
                 <attr2>6</attr2>
              </pear>
            </fruits> 
            <fruits>
              <apple>
                 <attr1>7</attr1>
                 <attr2>8</attr2>
              </apple>
              <orange>
                 <attr1>9</attr1>
                 <attr2>10</attr2>
              </orange>
              <pear>
                 <attr1>11</attr1>
                 <attr2>12</attr2>
              </pear>
            </fruits>   
        </fruit>
            ";
        var ser = new XmlSerializer(typeof(Fruit));
        using (var reader = new StringReader(xml))
        {
            var myFruits = (Fruit)ser.Deserialize(reader);
        }

        Console.Read();
    }
}


[XmlRoot("fruit")]
public class Fruit
{
    [XmlElement("fruits")]
    public List<Fruits> Fruits { get; set; }
}


public class Fruits
{
    [XmlElement("apple")]
    public Apple Apple { get; set; }

    [XmlElement("orange")]
    public Orange Orange { get; set; }

    [XmlElement("pear")]
    public Pear Pear { get; set; }
}

public class FruitCommonProperty
{
    [XmlElement("attr1")]
    public string Attr1 { get; set; }

    [XmlElement("attr2")]
    public string Attr2 { get; set; }
}

public class Apple : FruitCommonProperty { }

public class Orange : FruitCommonProperty { }

public class Pear : FruitCommonProperty { }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM