Partager via


XmlSchemaSet pour la compilation de schémas

Décrit le XmlSchemaSetcache où les schémas XSD (XML Schema Definition Language) peuvent être stockés et validés.

Classe XmlSchemaSet

Il XmlSchemaSet s’agit d’un cache dans lequel les schémas XSD (XML Schema Definition Language) peuvent être stockés et validés.

Dans System.Xml la version 1.0, les schémas XML ont été chargés dans une XmlSchemaCollection classe en tant que bibliothèque de schémas. Dans System.Xml la version 2.0, les XmlValidatingReader classes et les XmlSchemaCollection classes sont obsolètes et ont été remplacées par les Create méthodes, et la XmlSchemaSet classe respectivement.

Il XmlSchemaSet a été introduit pour résoudre un certain nombre de problèmes, notamment la compatibilité, les performances et le format de schéma Microsoft XML-Data réduit (XDR).

Voici une comparaison entre la XmlSchemaCollection classe et la XmlSchemaSet classe.

XmlSchemaCollection XmlSchemaSet
Prend en charge les schémas XML Microsoft XDR et W3C. Prend uniquement en charge les schémas XML W3C.
Les schémas sont compilés lorsque la Add méthode est appelée. Les schémas ne sont pas compilés lorsque la Add méthode est appelée. Cela offre une amélioration des performances lors de la création de la bibliothèque de schémas.
Chaque schéma génère une version compilée individuelle qui peut entraîner des « îles de schéma ». Par conséquent, tous les éléments inclus et les importations sont délimités uniquement dans ce schéma. Les schémas compilés génèrent un schéma logique unique, un « jeu » de schémas. Tous les schémas importés au sein d’un schéma ajoutés au jeu sont directement ajoutés au jeu eux-mêmes. Cela signifie que tous les types sont disponibles pour tous les schémas.
Un seul schéma pour un espace de noms cible particulier peut exister dans la collection. Plusieurs schémas pour le même espace de noms cible peuvent être ajoutés tant qu’il n’existe aucun conflit de type.

Migration vers XmlSchemaSet

L’exemple de code suivant fournit un guide de migration vers la nouvelle XmlSchemaSet classe à partir de la classe obsolète XmlSchemaCollection . L’exemple de code illustre les principales différences suivantes entre les deux classes.

Voici l’exemple de code obsolète XmlSchemaCollection .

Dim schemaCollection As XmlSchemaCollection = New XmlSchemaCollection()  
schemaCollection.Add("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd")  
schemaCollection.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd")  
  
Dim schema As XmlSchema  
  
For Each schema in schemaCollection  
  
   Console.WriteLine(schema.TargetNamespace)  
  
Next  
XmlSchemaCollection schemaCollection = new XmlSchemaCollection();  
schemaCollection.Add("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd");  
schemaCollection.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd");  
  
foreach(XmlSchema schema in schemaCollection)  
{  
   Console.WriteLine(schema.TargetNamespace);  
}  

Voici l’exemple de code équivalent XmlSchemaSet .

Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()  
schemaSet.Add("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd")  
schemaSet.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd")  
schemaSet.Compile()  
  
Dim schema As XmlSchema  
  
For Each schema in schemaSet.Schemas()  
  
   Console.WriteLine(schema.TargetNamespace)  
  
Next  
XmlSchemaSet schemaSet = new XmlSchemaSet();  
schemaSet.Add("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd");  
schemaSet.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd");  
schemaSet.Compile();  
  
foreach(XmlSchema schema in schemaSet.Schemas())  
{  
   Console.WriteLine(schema.TargetNamespace);  
}  

Ajout et récupération de schémas

Les schémas sont ajoutés à une XmlSchemaSet utilisation de la Add méthode .XmlSchemaSet Lorsqu’un schéma est ajouté à un XmlSchemaSetschéma, il est associé à un URI d’espace de noms cible. L’URI de l’espace de noms cible peut être spécifié en tant que paramètre pour la Add méthode ou si aucun espace de noms cible n’est spécifié, l’espace XmlSchemaSet de noms cible défini dans le schéma.

Les schémas sont récupérés à partir d’une XmlSchemaSet utilisation de la Schemas propriété du XmlSchemaSet. La Schemas propriété du fichier XmlSchemaSet vous permet d’itérer sur les XmlSchema objets contenus dans le XmlSchemaSet. La Schemas propriété retourne tous les XmlSchema objets contenus dans le XmlSchemaSetparamètre d’espace de noms cible ou, en fonction d’un paramètre d’espace de noms cible, retourne tous les XmlSchema objets qui appartiennent à l’espace de noms cible. Si null elle est spécifiée comme paramètre d’espace de noms cible, la Schemas propriété retourne tous les schémas sans espace de noms.

L’exemple suivant ajoute le books.xsd schéma dans l’espace http://www.contoso.com/books de noms à un XmlSchemaSetschéma , récupère tous les schémas qui appartiennent à l’espace de noms à partir de l’espace http://www.contoso.com/booksXmlSchemaSetde noms, puis écrit ces schémas dans le Console.

Dim schemaSet As XmlSchemaSet = New XmlSchemaSet  
schemaSet.Add("http://www.contoso.com/books", "books.xsd")  
  
Dim schema As XmlSchema  
  
For Each schema In schemaSet.Schemas("http://www.contoso.com/books")  
  
   schema.Write(Console.Out)  
  
Next  
XmlSchemaSet schemaSet = new XmlSchemaSet();  
schemaSet.Add("http://www.contoso.com/books", "books.xsd");  
  
foreach (XmlSchema schema in schemaSet.Schemas("http://www.contoso.com/books"))  
{  
   schema.Write(Console.Out);  
}  

Pour plus d’informations sur l’ajout et la récupération de schémas à partir d’un XmlSchemaSet objet, consultez la Add méthode et la documentation de référence sur les Schemas propriétés.

Compilation de schémas

Les schémas d’un schéma XmlSchemaSet sont compilés en un schéma logique par la Compile méthode du XmlSchemaSet.

Remarque

Contrairement à la classe obsolète XmlSchemaCollection , les schémas ne sont pas compilés lorsque la Add méthode est appelée.

Si la Compile méthode s’exécute correctement, la IsCompiled propriété du fichier XmlSchemaSet est définie sur true.

Remarque

La IsCompiled propriété n’est pas affectée si les schémas sont modifiés dans le XmlSchemaSet. Les mises à jour des schémas individuels dans le fichier XmlSchemaSet ne sont pas suivies. Par conséquent, la IsCompiled propriété peut être true même si l’un des schémas contenus dans le fichier XmlSchemaSet a été modifié, tant qu’aucun schéma n’a été ajouté ou supprimé du XmlSchemaSet.

L’exemple suivant ajoute le books.xsd fichier à la XmlSchemaSet méthode, puis appelle la Compile méthode.

Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()  
schemaSet.Add("http://www.contoso.com/books", "books.xsd")  
schemaSet.Compile()  
XmlSchemaSet schemaSet = new XmlSchemaSet();  
schemaSet.Add("http://www.contoso.com/books", "books.xsd");  
schemaSet.Compile();  

Pour plus d’informations sur la compilation de schémas dans un XmlSchemaSet, consultez la documentation de référence sur la Compile méthode.

Retraitement des schémas

Le retraitement d’un schéma dans un effectue XmlSchemaSet toutes les étapes de prétraitement effectuées sur un schéma lorsque la Add méthode du XmlSchemaSet schéma est appelée. Si l’appel à la Reprocess méthode réussit, la IsCompiled propriété du fichier XmlSchemaSet est définie falsesur .

La Reprocess méthode doit être utilisée lorsqu’un schéma dans l’objet XmlSchemaSet a été modifié une fois la XmlSchemaSet compilation effectuée.

L’exemple suivant illustre le retraitement d’un schéma ajouté à l’utilisation XmlSchemaSet de la Reprocess méthode. Une fois la XmlSchemaSetCompile méthode compilée et le schéma ajouté à celui-ci XmlSchemaSet , la IsCompiled propriété est définie true sur même si un schéma dans l’objet XmlSchemaSet a été modifié. L’appel de la Reprocess méthode effectue tout le prétraitement effectué par la Add méthode et définit la IsCompiled propriété falsesur .

Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()  
Dim schema As XmlSchema = schemaSet.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd")  
schemaSet.Compile()  
  
Dim element As XmlSchemaElement = New XmlSchemaElement()  
schema.Items.Add(element)  
element.Name = "book"  
element.SchemaTypeName = New XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema")  
  
schemaSet.Reprocess(schema)  
XmlSchemaSet schemaSet = new XmlSchemaSet();  
XmlSchema schema = schemaSet.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd");  
schemaSet.Compile();  
  
XmlSchemaElement element = new XmlSchemaElement();  
schema.Items.Add(element);  
element.Name = "book";  
element.SchemaTypeName = new XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema");  
  
schemaSet.Reprocess(schema);  

Pour plus d’informations sur le retraitement d’un schéma dans un XmlSchemaSet, consultez la documentation de référence sur la Reprocess méthode.

Vérification d’un schéma

Vous pouvez utiliser la Contains méthode de la XmlSchemaSet méthode pour vérifier si un schéma est contenu dans un XmlSchemaSet. La Contains méthode prend un espace de noms cible ou un XmlSchema objet à rechercher. Dans les deux cas, la méthode retourne true si le schéma est contenu dans le XmlSchemaSet; sinon, il retourne false.Contains

Pour plus d’informations sur la vérification d’un schéma, consultez la documentation de référence sur la Contains méthode.

Suppression de schémas

Les schémas sont supprimés d’une XmlSchemaSet utilisation des RemoveRemoveRecursive méthodes et des méthodes du XmlSchemaSet. La Remove méthode supprime le schéma spécifié du XmlSchemaSetschéma, tandis que la RemoveRecursive méthode supprime le schéma spécifié et tous les schémas qu’il importe du XmlSchemaSet.

L’exemple suivant illustre l’ajout de plusieurs schémas à un XmlSchemaSet, puis l’utilisation de la RemoveRecursive méthode pour supprimer l’un des schémas et tous les schémas qu’il importe.

Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()  
schemaSet.Add("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd")  
schemaSet.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd")  
schemaSet.Add("http://www.contoso.com/music", "http://www.contoso.com/music.xsd")  
  
Dim schema As XmlSchema  
  
For Each schema In schemaSet.Schemas()  
  
   If schema.TargetNamespace = "http://www.contoso.com/music" Then  
      schemaSet.RemoveRecursive(schema)  
   End If  
  
Next  
XmlSchemaSet schemaSet = new XmlSchemaSet();  
schemaSet.Add("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd");  
schemaSet.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd");  
schemaSet.Add("http://www.contoso.com/music", "http://www.contoso.com/music.xsd");  
  
foreach (XmlSchema schema in schemaSet.Schemas())  
{  
   if (schema.TargetNamespace == "http://www.contoso.com/music")  
   {  
      schemaSet.RemoveRecursive(schema);  
   }  
}  

Pour plus d’informations sur la suppression de schémas d’un XmlSchemaSet, consultez la documentation de référence sur les méthodes et RemoveRecursive les Remove méthodes.

Résolution de schéma et xs :import

Les exemples suivants décrivent le XmlSchemaSet comportement d’importation de schémas lorsque plusieurs schémas pour un espace de noms donné existent dans un XmlSchemaSet.

Par exemple, considérez un XmlSchemaSet qui contient plusieurs schémas pour l’espace http://www.contoso.com de noms. Un schéma avec la directive suivante xs:import est ajouté au XmlSchemaSet.

<xs:import namespace="http://www.contoso.com" schemaLocation="http://www.contoso.com/schema.xsd" />  

La XmlSchemaSet tentative d’importation d’un schéma pour l’espace http://www.contoso.com de noms en le chargeant à partir de l’URL http://www.contoso.com/schema.xsd . Seule la déclaration de schéma et les types déclarés dans le document de schéma sont disponibles dans le schéma d’importation, même s’il existe d’autres documents de schéma pour l’espace de noms dans le http://www.contoso.comXmlSchemaSet. Si le schema.xsd fichier ne peut pas se trouver à l’URL http://www.contoso.com/schema.xsd , aucun schéma pour l’espace http://www.contoso.com de noms n’est importé dans le schéma d’importation.

Validation de documents XML

Les documents XML peuvent être validés par rapport aux schémas d’un XmlSchemaSet. Vous validez un document XML en ajoutant un schéma à la XmlSchemaSetSchemas propriété d’un XmlReaderSettings objet ou en ajoutant une XmlSchemaSet à la Schemas propriété d’un XmlReaderSettings objet. L’objet XmlReaderSettings est ensuite utilisé par la Create méthode de la XmlReader classe pour créer un XmlReader objet et valider le document XML.

Pour plus d’informations sur la validation de documents XML à l’aide d’une XmlSchemaSetvalidation de schéma XML (XSD) avec XmlSchemaSet.

Voir aussi