C# XML 多种类型列表

C# XML List of Multiple Types

我正在从非常复杂的第 3 方 Web 服务中提取一些数据。 XSD 工具不适用于特定模式,因此我尝试手动构建所有数据对象。

<Children>
    <Activity></Activity>
    <Activity></Activity>
    <Container></Container>
    <Activity></Activity>
    <Container></Container>
    ...
</Children>

基本上,集合中的每个项目都可以是 Activity 或容器,但不能同时是两者。

我正在尝试使用 C# 中的 XmlSerializer 来 Serialize/Deserialize Xml 并且我有一个对象库支持当前看起来像这样的 Serializer:

[XmlType(AnonymousType = true)]
public class Children: XmlEntityBase, IChildren
{
 [XmlElement("Children", IsNullable = false)]
 public List<ChildrenItems> ChildrenItems { get; } = new List<ChildrenItems>();
}

[XmlType(AnonymousType = true)]
public class ChildrenItem: XmlEntityChoice, IChildrenItem
{
 [NotMapped]
 [XmlElement(nameof(Activity), Type = typeof(Activity), IsNullable = false)]
 [XmlElement(nameof(Container), Type = typeof(Container), IsNullable = false)]
 public object SelectedValue
 {
  get { return _selectedValue; }
  set 
  { 
   if(_selectedValue == value) return;
    SetValue(value);
  }
 }

 [XmlIgnore]
 public Activity Activity 
 {
  get 
  {
   if(ValueType == typeof(Activity))
   {
    return (Activity)SelectedValue;
   }
   throw new ChoiceTypeException($"Invalid Type: {nameof(Activity)}!");
  }
 }

 [XmlIgnore]
 public Container Container
 {
  get
  {
   if(ValueType == typeof(Container)
   {
    return (Container)SelectedValue;
   }
   throw new ChoiceTypeException($"Invalid Type: {nameof(Container)}!");
  }
 }
}

ChildrenItem 是我尝试在 XML 中编写 xsd:choice。

不幸的是,当我从 WebService 反序列化 XML 时,会跳过 Children 集合。

1) 如何修复我的对象以便它们正确处理 XML? 2) 有没有比我在这里处理 xsd:choice 元素更好的方法?

谢谢,祝你有个愉快的一天!

这就是您真正需要的。不要使用数组,因为它会创建额外的标签层,这在您的情况下不起作用。 XmlElement 将使用数组或列表。

    [XmlRoot("Children")]
    public class Children
    {
        [XmlElement("Activity")]
        List<Activity> activity { get; set; }

        [XmlElement("Container")]
        List<Container> container { get; set; }
    }
    [XmlRoot("Activity")]
    public class Activity
    {

    }
    [XmlRoot("Container")]
    public class Container
    {

    }