2009-07-30 78 views
0

在第一种情形下,一切都是很容易的,我有以下XML,我可以反序列化到一个强类型。反序列化动态XML

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

在第二个方案中,而这正是我需要帮助...我有一些更动态

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

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

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

回答

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名称空间的正确属性简单地修饰正确的属性和类来序列化/反序列化您的提供者对象。

0

跳转想到的第一件事是自定义的反序列化。此时,您的dprovider类可以有一个名为Dimensions的名为<的对象>,其中包含您需要的子主体。唯一的痛苦就是把他们拉回来,因为你必须做一堆“是”逻辑。

如果你正在寻找有一个“全嵌套子结构”,该子结构应该被定义为自己的类/结构,然后添加到列表尺寸。

+0

如果我有对象的列表,然后 - >我想我可以容纳任何对象,与该集合中的任何结构? – 2009-07-30 12:54:22

+0

确切地说,但我不确定这是否填满了“需要强类型”的要求,因为您的代码看起来像: if(dProvider.Dimensions [0]是ObjWithHeight) height =((ObjWithHeight) 。dProvider.Dimensions [0])的高度; 每次都必须这样做是一种皇室的痛苦。如果您要提供关于最终目标是什么(而不是您选择的方法)的更多说明,社区可能会建议一种与自定义反序列化+对象列表+投射相比不同的方法。 – JustLoren 2009-07-30 13:18:09

1

我想你可能会丢失的C#到XML序列化/反序列化的地步。

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

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

+0

您可能想要使用DataContractSerializer,它可以处理比通常的xml序列化器更好的集合。我不知道你是否需要它。 – 2009-07-30 14:16:01