2009-09-10 5 views
0

J'ai un élément qui peut avoir plusieurs types (pas ma conception). L'élément lui-même est un type complexe avec une séquence de sous-éléments et le XML est généré à partir de la sérialisation d'une propriété, et cette propriété renvoie un type de classe de base. Ainsi, lorsque le XML est généré, le type finit par être défini dans le XML, quel que soit l'objet. Par exemple:Validation XML pour un élément avec plusieurs types?

 <Answer xsi:type="AnswerBool"> 
     <Value xsi:type="xsd:int">-1</Value> 
     </Answer> 

Ou peut-être:

 <Answer xsi:type="AnswerString"> 
     <Value xsi:type="xsd:string">-1</Value> 
     </Answer> 

La propriété C# ressemble à ceci:

public AnswerBase Answer 
    { 
     get { return mViewAnswer; } 
     set { mViewAnswer = value; } 
    } 

Donc, si la variable nViewAnswer est de type AnswerBool alors le premier exemple XML est généré lors de la sérialisation. S'il est de type AnswerString, le second exemple XML est généré. J'ai donc travaillé sur une sorte de XSD pour le XML. Cependant, quand il s'agit de validation, je n'arrive pas à faire fonctionner ça. Évidemment, une option serait de modifier la structure du XML et d'avoir des sous-éléments de l'élément "Answer". Cependant, cela nécessiterait un remaniement des fonctionnalités existantes que je préférerais éviter si possible. Donc ....

Y a-t-il un moyen de faire en sorte qu'un élément ait différents types définis dans le schéma?

Ou existe-t-il un moyen de configurer le XSD afin qu'il ignore le type xsi: pour cet élément lors de la validation? J'ai joué avec anyAttribute processContents mais je ne crois pas que cela aidera. Est-ce que je vais être bloqué en retravaillant comment le XML est formé?

+0

Il serait utile de voir comment cela fonctionne, vous pouvez répondre à votre propre question et l'accepter comme réponse. Au moins de cette façon, il donne un article complet à quelqu'un d'autre à lire s'il essaie de faire quelque chose de similaire. :) –

+0

Une fois que je l'ai travaillé à 100%, je ferai exactement cela. Je suis coincé sur un dernier numéro. – Eves

Répondre

1

Vérifiez this post qui, si rien d'autre ne vous indiquera une autre lecture.

Il n'est peut-être pas si mal de retravailler le fichier XML si vous envisagez d'effectuer une transformation. Habituellement, vous êtes bloqué avec le fichier XML problématique pour une raison, c'est-à-dire qu'un système existant l'exporte de cette façon. Une transformation utilisant xslt, vous permettrait de conserver l'ancien xml et de l'avoir dans le nouveau format pour la validation contre un nouveau schéma. Le double bonus est que vous savez que le XML transformé est valide.

+0

Merci pour le lien. Je l'ai presque travaillé. – Eves

1

J'ai été incapable d'obtenir mon XML pour travailler avec n'importe quelle forme de schéma que j'ai essayé. Il semblait que j'avais presque avec toute chose sur la génération de mon propre attribut « type », mais finalement je le fait que mon XML avait:

 <Answer xsi:type="AnswerBool"> 
     <Value xsi:type="xsd:int">-1</Value> 
     </Answer> 

Je ne pouvais pas gérer la « xsi: » une partie de la " type "puisque mon attribut était simplement" type "et ne correspondrait donc pas avec" xsi: type ". Mes instances de schéma étaient toutes les mêmes, donc je ne sais pas pourquoi il y avait un problème.

Alors je vais changer des choses pour ne plus avoir un seul élément "Answer". J'aurai quelques douzaines d'éléments différents, un pour chaque type. Bummer.

Merci pour l'aide Mark.

Questions connexes