如何解决如何将不同名称的XML节点反序列化为相同的基本类型
我在网上找不到一个示例,无法确切说明如何配置XmlSerializer以所需的方式对XML进行反序列化。
我想将此XML反序列化为Fruits
或至少List<Fruit>
<fruits>
<apple>{fruitstuff}</apple>
<orange>{fruitstuff}</orange>
<pear>{fruitstuff}</pear>
<fruits>
我想象一个像这样的模型
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模型相比,我宁愿拥有精心配置的自定义序列化程序。我可能想将模型与XML以外的其他格式一起使用。我认为在模型中遍布xml属性比目标序列化实现要优雅。
解决方法
- 添加
<fruit>
元素以包装多个<fruits>
元素 - 将
XmlRoot
和XmlElement
属性添加到相应的分类中。
我的示例代码可以正常工作:
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 { }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。