2009-07-30 102 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