2010-11-09 3 views
3

Je suis en train de concevoir des classes complexes dans VB.net (mais vous pouvez écrire votre réponse en C# si vous préférez: P) qui contiennent des données qui doivent être chargées à partir de XML. La solution évidente est, bien sûr, de concevoir une classe sérialisable, afin d'automatiser le processus de chargement.Est-il possible de faire une sérialisation XML "mixte" dans .net?

Maintenant, mon problème est le suivant: la structure XML est fixe, et je ne peux pas la changer, et elle a quelques inconvénients qui rendent la sérialisation difficile. Voici un exemple d'un petit morceau de DTD qui explique mieux le problème:

<!ELEMENT Relationship (AttributePairs | AscendCaption | DescendCaption | ErrPreventInsertOrUpdateChild | ErrPreventDeleteParent | ErrPreventUpdateParent |ExtendedProperties |HiddenProperties)* > 
<!ATTLIST Relationship 

    CountAggregates CDATA #IMPLIED 
    CountReplicates CDATA #IMPLIED 
    OnParentUpdate (PreventIfChildren|UpdateChildren) #IMPLIED 
    OnParentDelete (PreventIfChildren|DeleteChildren|NullChildrenForeignKey) #IMPLIED 
    IsEnforce (True|False) #REQUIRED 
    OnChildInsertOrUpdate (PreventIfNoParent|InsertParentIfNone) #IMPLIED 
    ChildRoleName CDATA #IMPLIED 
    ParentRoleName CDATA #IMPLIED 
    ParentAttributeGroupInstance CDATA #IMPLIED 
    ChildAttributeGroupInstance CDATA #IMPLIED 

> 

<!--Lots of other sutff not needed for this example --> 

Comme vous pouvez le voir, tous les attributs ci-dessus pourraient être facilement sérialisés simplement en déclarant la propriété correspondante et la décoration avec l'étiquette <XmlAttribute()>. Sauf pour:

IsEnforce (True | False) #REQUIRED

Depuis Vrai et faux ne sont pas des valeurs booléennes valides en XML (en raison du capital T et F) et le processus de sérialisation échouera. Maintenant, la seule autre option que je connais est d'implémenter IXMLSerializable à la main, ce que j'ai fait pour d'autres classes, et cela fonctionne, mais cela signifie aussi que je dois lire "manuellement" chaque attribut/élément, même ceux que je pourrais facilement sérialiser automatiquement avec des étiquettes. Donc, enfin, ma question: est-il possible de MIX les deux méthodes? Soit: sérialiser automatiquement avec des balises, puis "entrer" manuellement et lire manuellement les valeurs les plus "délicates"? (Le booléen juste un exemple, supposons que je veux lire manuellement certaines propriétés à volonté)

+0

Alors vous avez une DTD XML avec des valeurs illégales? – StingyJack

+0

XML est très strict. Si vous êtes "xml" nécessite un XML non valide, alors ce n'est pas xml ... donc vous aurez probablement besoin d'un pré-processeur pour gérer les problèmes et garder votre * manipulation XML réelle * dirt-simple – STW

+0

@StingyJack: non, dans DTD vous pouvez faire ce que vous voulez, et les concepteurs de cette DTD (je ne l'ai pas conçu) ont décidé d'utiliser True et False. MAIS le standard XSchema, qui est utilisé pour la sérialisation dans .NET, est plus strict et n'autorise que "true" et "false" comme booléens valides. Le problème ici est que j'ai déjà le XML, et ce n'est pas "incorrect" en soi ... le point est que je dois l'adapter à mes besoins, et dans la classe j'ai besoin d'un booléen, donc je dois en quelque sorte le lire comme un booléen, même si pour la DTD c'est juste un attribut énuméré –

Répondre

1

vous pouvez toujours créer champ private (ou avec XmlIgnore) de type bool puis propriété qui exposeront comme True/False et ont un setter qui peut analyser quelque chose comme T/F, True/False, Y/N, etc.

Pour le cas générique, vous pouvez créer enum.

+0

Ceci est une solution de contournement intéressante, merci pour les heads-up! Tho il ne répond pas à la question de savoir si je peux ou non mélanger les tags avec IXMLSerializable –

+0

@Master_T je suppose que non.Ma suggestion est vraiment bon marché et simple. Cela m'a beaucoup aidé. – Andrey

+0

@Master_T: non, vous ne pouvez pas les mélanger. J'utilise aussi des propriétés d'adaptateur ou des enums. –

Questions connexes