2009-07-30 3 views
0

Dans le premier scénario, tout est assez facile, j'ai le XML suivant, que je peux désérialiser en un type fort.Deserializing Dynamic XML

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

Dans le 2ème cas de figure, ce qui est là où je besoin d'aide pour ... J'ai quelque chose d'un peu plus dynamique

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

Comme vous pouvez le voir les dimensions La sous-structure est différente dans les deux éléments, donc j'ai besoin de trouver un moyen de créer la classe fortement typée, afin qu'elle puisse gérer toute modification de l'élément dimensions, elle pourrait par exemple contenir un ole sous-structure imbriquée, différente pour chaque dbprovider.

Des idées sur la façon dont cela est fait?

Répondre

2

Essayez ceci:

[Serializable] 
class Dimension { ... } 

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

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

Puis, dans la classe que votre (notez le pluriel) élément désérialise dans, cette propriété:

[XmlElement(Type = typeof(Height), ElementName = "height")] 
[XmlElement(Type = typeof(Width), ElementName = "width")] 
public Dimension[] DimensionArray { 
    get { ... } 
    set { ... } 
} 

est ici le point de départ de documentation on XML serialization (XmlElement classe), de sorte que vous pouvez comprendre le reste des détails.

Vous devriez être en mesure de sérialisation/désérialisation en décorant simplement votre objet fournisseurs les bonnes propriétés et des classes avec les bons attributs de l'espace de noms System.Xml.Serialization.

0

La première chose qui me vient à l'esprit est la désérialisation personnalisée. À ce stade, votre classe dprovider peut avoir un objet List, appelé Dimensions, qui contient l'hôte de subjobjects dont vous avez besoin. La seule douleur est de les retirer, parce que vous devrez faire un tas de logique "est".

Si vous cherchez à avoir une "sous-structure imbriquée entière", cette sous-structure doit être définie comme sa propre classe/structure, puis ajoutée à la liste des dimensions.

+0

si j'ai une liste d'objets, alors -> je suppose que je peux contenir n'importe quel objet, avec n'importe quelle structure dans cette collection? –

+0

Exactement, mais je ne suis pas sûr si cela remplit votre exigence "doit être fortement typé", puisque votre code ressemblera à: si (dProvider.Dimensions [0] est ObjWithHeight) height = ((ObjWithHeight) dProvider.Dimensions [0]). Hauteur; Avoir à faire ce casting à chaque fois est une douleur royale. Si vous fournissiez plus de précisions sur votre objectif final (plutôt que sur la méthode que vous avez choisie), la communauté pourrait suggérer une méthode différente de la désérialisation personnalisée + Liste d'objets + diffusion. – JustLoren

1

Je pense que vous pourriez manquer le point de C# à XML Serialization/Deserialization.

Vous devez soit définir un schéma (ou utiliser celui que vous avez déjà) et créer une classe C# qui le supporte. See MSDN article on xsd.exe

L'autre route consiste à créer votre classe C# (et à l'intégrer dans une collection à partir de votre balisage) et à ajouter des attributs XML. Cela va essentiellement définir votre schéma XML.

+0

Vous pouvez utiliser le DataContractSerializer qui peut gérer les collections mieux que le sérialiseur xml normal. Je ne peux pas dire si vous en avez besoin. –