8
votes

Le moyen le plus performant de valider XML contre XSD

Je reçois une variable de chaîne avec XML en elle et disposez d'un fichier XSD. Je dois valider le XML dans la chaîne contre le fichier XSD et savoir qu'il y a plus d'une manière (xmldocument, xmlreader, ...?).

Après la validation, je dois juste stocker le XML, donc je n'en ai pas besoin dans un xdocument ou xmldocument.

Quelle est la voie à suivre si je veux la performance la plus rapide?


0 commentaires

4 Réponses :


3
votes

J'irais pour la xmlreader avec xmlreadersettings car il n'est pas nécessaire de charger le XML complet en mémoire. Il sera plus efficace pour les gros fichiers XML.


0 commentaires

2
votes

Je pense que le moyen le plus rapide est d'utiliser un XMLReader qui valide le document tel qu'il est lu. Cela vous permet de valider le document en un seul passage: http: // msdn. microsoft.com/en-us/library/hdf992b8.aspx


0 commentaires

0
votes

Utilisez un xmlreader < / a> configuré pour effectuer la validation, la source étant un < Code> Textreader .

Vous pouvez spécifier manuellement le XSD le xmlreader est à utiliser si vous ne souhaitez pas compter sur des déclarations du document d'entrée (avec < a href = "http://msdn.microsoft.com/en-us/library/system.xml.xmlreaderSettings.schemas.aspx" rel = "nfollow NOREFERRER"> xmlreadersettings.schemas Propriété)

Un démarrage (suppose simplement que les déclarations de l'instance XSD dans le document d'entrée) seraient les suivantes: xxx


0 commentaires

13
votes

D'autres ont déjà mentionné la catégorie code> xmlreader code> pour effectuer la validation, et je ne participerai pas à cela.

Votre question ne spécifie pas beaucoup de contexte. Voulez-vous effectuer cette validation à plusieurs reprises pour plusieurs documents XML ou une seule fois? Je lis un scénario où vous validez simplement beaucoup de documents XML (d'un système tiers?) Et de les stocker pour une utilisation future. P>

Ma contribution à la chasse au rendement serait d'utiliser une compilée xmlschemaset code> qui serait le fil sûr, de sorte que plusieurs threads peuvent la réutiliser sans avoir à analyser le document XSD. P>

var xmlSchema = XmlSchema.Read(stream, null);
var xmlSchemaSet = new XmlSchemaSet();
xmlSchemaSet.Add(xmlSchema);
xmlSchemaSet.Compile();

CachedSchemas.Add(name, xmlSchemaSet);


6 commentaires

Oui, je valide et stocke beaucoup de document XML à partir d'un système tiers pour une utilisation ultérieure. Le XSD est toujours le même, de sorte que votre indice, la compilation du jeu de schéma est beaucoup appris, merci!


Qu'est-ce que cachedschemas dans cet exemple?


Juste une imminente pour la mise en cache des résultats.


Pourquoi pensez-vous que xmlschemaseet est le fil sûr? blogs.msdn.com/b/ XMLTeam / Archive / 2009/04/27 / ...


@Richb, cet exemple fonctionne comme je l'ai décrit. Initialisez un XMLSCHEMASET, compilez-le, puis utilisez-le à partir de plusieurs threads. Mais non, il n'y a pas de soutien pour ce que je dis dans une documentation que je peux trouver.


Vous voudrez peut-être examiner dans xmlreadersettings.ignorécomneurs , ignorewhiteespace et ignoréprocessinginstructions ; Mes tests s'appliquent uniquement aux fichiers XML sans commentaires, mais si le vôtre contient des commentaires lourds, cela pourrait aider (à vérifier)