反序列化动态XML

时间:2009-07-30 12:35:08

标签: c# xml

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

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

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

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

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

关于如何做到的任何想法?

3 个答案:

答案 0 :(得分:2)

试试这个:

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

这是documentation on XML serialization(XmlElement类)的起点,因此您可以找出其余的细节。

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

答案 1 :(得分:1)

我认为您可能忽略了C#对XML序列化/反序列化的重点。

您应该定义一个模式(或使用您已经拥有的模式)并创建一个支持它的C#类。 See MSDN article on xsd.exe

另一种方法是创建C#类(并将其包装在标记的集合中)并添加XML属性。这基本上将定义您的XML架构。 See here for starting point on the XmlRootAttribute

答案 2 :(得分:0)

首先想到的是自定义反序列化。此时,您的dprovider类可以具有List&lt; object&gt;称为Dimensions,它具有您需要的主机对象。唯一的痛苦就是将它们拉回来,因为你必须做一堆“是”的逻辑。

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