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é)
Alors vous avez une DTD XML avec des valeurs illégales? – StingyJack
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
@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é –