2010-01-23 4 views
1

Je regardais la sérialisation XML pour C# et ça a l'air intéressant. Je lisais ce tutorielQuel serait le meilleur moyen de valider XML?

http://www.switchonthecode.com/tutorials/csharp-tutorial-xml-serialization

et bien sûr, vous pouvez de sérialisation revenir à une liste d'objets. Je me demande donc s'il serait préférable de le sérialiser de nouveau vers une liste d'objets, puis de parcourir chaque objet et de le valider ou de le valider en utilisant un schéma puis en le sérialisant et en faisant des choses avec lui?

http://support.microsoft.com/kb/307379

Merci

Répondre

1

je suppose que cela dépend un peu sur ce que vous voulez valider, et dans quel but. S'il est destiné à interopérer avec d'autres systèmes, la validation via xsd est une bonne idée, car vous pouvez utiliser xsd.exe pour écrire vos classes depuis xsd (vous pouvez aussi générer xsd depuis xml ou dll, mais ce n'est pas aussi précis). De même, vous pouvez utiliser XmlReader (correctement configuré) pour vérifier xsd,

Si vous voulez juste des objets .NET valides, je serais tenté de laisser le formulaire sérialisé comme un détail d'implémentation, et d'écrire du code de validation C# - peut-être implémentant IDataErrorInfo ou utilisant des annotations de données.

+0

J'ai rencontré des problèmes où xml était légal contre la définition XSD mais pas contre le schéma réel. C'est une bonne vérification pour que le sérialiseur fonctionne contre votre entrée, mais ce n'est pas une vraie validation du XML par rapport au schéma. – Spence

+0

@Spence - pour info, que voulez-vous dire par "schéma réel" dans ce scénario? –

+0

Eh bien, la sortie de xsd.exe woudl create dit une propriété avec un entier. Si votre schéma met alors une restriction sur la plage de cet entier, xsd.exe ne le représentera pas. En outre, pour la vitesse, xmlserializer ne vérifie pas la vitesse. Donc, si vous ne validez pas l'entrée par rapport au schéma, vous pouvez avoir un objet métier et une sortie XML qui est en fait illégale selon vos spécifications. – Spence

0

Vous pouvez créer un XmlValidatingReader et le transmettre dans votre sérialiseur. De cette façon, vous pouvez lire le fichier en un seul passage et le valider en même temps.

Je crois que la même technique fonctionnera même si vous utilisez des classes XML roulées à la main (pour les fichiers XML extrêmement volumineux), donc vous pourriez trouver ça intéressant.

Edit:

Désolé viens de relire une partie de mon code, XmlValidatingReader est obsolète, vous pouvez faire ce que vous avez besoin avec XmlReader.

Voir XmlReader Settings

0

Pour la vitesse, je le ferais en C#, mais pour être complet, vous pouvez le faire en utilisant un XSD. Le problème avec cela est que vous devez apprendre la syntaxe verbeuse et encombrante XSD, qui par expérience nécessite beaucoup d'essais et d'erreurs, prend beaucoup de temps et ne détient pas beaucoup de récompense pour la sérialisation. Particulièrement avec les constantes où vous devez les mapper en C# et aussi dans le XSD.

Vous allez toujours écrire le code XML en C#. Tout ce qui n'est pas connu lors de la relecture est simplement ignoré. Si vous ne modifiez pas le XML avec un éditeur de texte, vous pouvez garantir qu'il reviendra dans le bon sens, auquel cas XSD n'est absolument pas nécessaire.

+0

Eh bien, je m'attends à ce que les gens éditent le fichier XML et il doit être dans le bon format afin que les données puissent être saisies dans ma base de données. – chobo2

+0

@chobo pourriez-vous écrire une application pour les éditer avec? Si vous n'êtes pas ou ne voulez pas être un expert XML [xsd] cela prendra moins de temps –

0

Si vous validez le code XML, vous pouvez uniquement prouver qu'il est structurellement correct. Une tentative de désérialisation à partir du XML vous dira la même chose.

Généralement, les objets métier peuvent implémenter une logique métier/des règles/des conditions qui vont au-delà d'un schéma valide. Ce type de connaissance doit rester avec les objets métier eux-mêmes, plutôt que d'être dupliqué dans une sorte de routine de validation externe (sinon, si vous modifiez une règle métier, vous devez mettre à jour le validateur en même temps).

+0

Je veux valider la structure et les champs réels. Comme dire que le champ A ne devrait pas être vide. Je pense qu'un schéma pourrait faire les deux mais je ne suis pas sûr. – chobo2

Questions connexes