反序列化动态XML

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

      

在第二种情况下,这是我需要帮助的地方……我有一些更有活力的东西

            

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

关于如何做到这一点的任何想法?

试试这个:

 [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 { ... } } 

这是关于XML序列化 (XmlElement类)的文档的起点,因此您可以找出其余的细节。

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

我想你可能会忽略C#到XML序列化/反序列化的重点。

您应该定义一个模式(或使用您已经拥有的模式)并创建一个支持它的C#类。 请参阅有关xsd.exe的MSDN文章

另一种方法是创建C#类(并将其包装在标记的集合中)并添加XML属性。 这基本上将定义您的XML架构。 请参阅此处了解XmlRootAttribute的起点

跳到脑海的第一件事是自定义反序列化。 此时,您的dprovider类可以有一个名为Dimensions的List ,它具有您需要的主机对象。 唯一的痛苦就是将它们拉回来,因为你必须做一堆“是”的逻辑。

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