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
{
}
我正在从非常复杂的第 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
{
}