C# 反序列化动态XML

C# 反序列化动态XML,c#,xml,C#,Xml,在第一个场景中,一切都很简单,我有以下XML,可以反序列化为强类型 <providers> <dprovider> <dimensions> <width></width> </dimensions> </dbrovider> 在第二个场景中,这就是我需要帮助的地方。。。我有一些更有活力的东西 <providers> <dprov

在第一个场景中,一切都很简单,我有以下XML,可以反序列化为强类型

<providers>
   <dprovider>
      <dimensions>
         <width></width>
     </dimensions>
   </dbrovider>

在第二个场景中,这就是我需要帮助的地方。。。我有一些更有活力的东西

<providers>
   <dprovider>
      <dimensions>
         <width></width>
     </dimensions>
   </dbrovider>
     <dprovider>
      <dimensions>
         <height></height>
     </dimensions>
   </dbrovider>

正如您所看到的,这两个项目中的维度子结构是不同的,因此我需要找到一种方法来创建强类型类,以便它能够处理对维度元素的任何更改,例如,它可以包含一个完整的嵌套子结构,每个dbprovider都不同


关于如何做到这一点有什么想法吗?

首先想到的是自定义反序列化。此时,您的dprovider类可以有一个名为Dimensions的列表,其中包含您所需的对象主机。唯一的痛苦是把他们拉出来,因为你必须做一大堆“是”的逻辑


如果您希望有一个“整个嵌套子结构”,那么应该将该子结构定义为它自己的类/结构,然后添加到维度列表中。

首先想到的是自定义反序列化。此时,您的dprovider类可以有一个名为Dimensions的列表,其中包含您所需的对象主机。唯一的痛苦是把他们拉出来,因为你必须做一大堆“是”的逻辑


如果您希望有一个“完整的嵌套子结构”,那么应该将该子结构定义为它自己的类/结构,然后添加到维度列表中。

我认为您可能忽略了C到XML序列化/反序列化的要点

您应该定义一个模式(或者使用已有的模式)并创建一个支持它的C#类


另一种方法是创建C#类(并将其包装在标记的集合中)并添加XML属性。这将从本质上定义XML模式

我认为您可能忽略了C到XML序列化/反序列化的要点

您应该定义一个模式(或者使用已有的模式)并创建一个支持它的C#类

另一种方法是创建C#类(并将其包装在标记的集合中)并添加XML属性。这将从本质上定义XML模式

试试这个:

[Serializable]
class Dimension { ... }

[Serializable]
class Height : Dimension { ... }

[Serializable]
class Width : Dimension { ... }
然后,在(注意复数)元素反序列化到的类中,具有以下属性:

[XmlElement( Type = typeof( Height ), ElementName = "height" )]
[XmlElement( Type = typeof( Width ), ElementName = "width" )]
public Dimension[] DimensionArray {
    get { ... }
    set { ... }
}
这里是(XmlElement类)的起点,因此您可以了解其余细节

您应该能够序列化/反序列化提供程序对象,只需使用System.Xml.Serialization命名空间中的正确属性装饰正确的属性和类即可。

尝试以下操作:

[Serializable]
class Dimension { ... }

[Serializable]
class Height : Dimension { ... }

[Serializable]
class Width : Dimension { ... }
然后,在(注意复数)元素反序列化到的类中,具有以下属性:

[XmlElement( Type = typeof( Height ), ElementName = "height" )]
[XmlElement( Type = typeof( Width ), ElementName = "width" )]
public Dimension[] DimensionArray {
    get { ... }
    set { ... }
}
这里是(XmlElement类)的起点,因此您可以了解其余细节


通过使用System.Xml.Serialization命名空间中的正确属性装饰正确的属性和类,您应该能够序列化/反序列化您的providers对象。

如果我有对象列表,那么->我想我可以保存该集合中具有任何结构的任何对象?确切地说,但我不确定这是否满足了您的“需要强类型”要求,因为您的代码如下所示:if(dProvider.Dimensions[0]是ObjWithHeight)height=((ObjWithHeight)dProvider.Dimensions[0]).height;每次都要这样做是一件非常痛苦的事。如果你要对你的最终目标(而不是你选择的方法)提供更多的说明,社区可能会建议一种不同的方法,而不是自定义反序列化+对象列表+强制转换。如果我有对象列表,那么->我猜我可以持有任何对象,该集合中有任何结构?没错,但我不确定这是否满足了您的“需要强类型”要求,因为您的代码如下所示:if(dProvider.Dimensions[0]是ObjWithHeight)height=((ObjWithHeight)dProvider.Dimensions[0]).height;每次都要这样做是一件非常痛苦的事。如果您要对最终目标(而不是您选择的方法)提供更多说明,社区可能会建议一种不同的方法,而不是自定义反序列化+对象列表+强制转换。您可能希望使用DataContractSerializer,它可以比普通的xml序列化器更好地处理集合。我不知道您是否需要它。您可能需要使用DataContractSerializer,它比普通的xml序列化程序能够更好地处理集合。我不知道你是否需要它。