XmlSchemaSet pour la compilation de schémas

Décrit l'objet XmlSchemaSet, un cache où les schémas de langage XSD (XML Schema Definition) peuvent être stockés et validés.

Classe XmlSchemaSet

L'objet XmlSchemaSet est un cache où les schémas de langage XSD (XML Schema Definition) peuvent être stockés et validés.

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

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

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

XmlSchemaCollection XmlSchemaSet
Prend en charge les schémas XML du W3C et XDR de Microsoft. Ne prend en charge que les schémas XML du W3C.
Les schémas sont compilés lors d'un appel à la méthode Add. Les schémas ne sont pas compilés lors d'un appel à la méthode Add. Les performances sont ainsi améliorées 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 « îlots de schéma ». Ainsi, toutes les inclusions et importations sont délimitées au sein de l’étendue de ce schéma uniquement. Les schémas compilés génèrent un seul schéma logique, un « ensemble » de schémas. Tous les schémas importés dans un schéma qui est ajouté à l'ensemble sont également directement ajoutés à l'ensemble. Tous les types sont donc disponibles pour tous les schémas.
Un seul schéma peut exister dans la collection pour un espace de noms cible particulier. Plusieurs schémas peuvent être ajoutés pour le même espace de noms cible tant qu'aucun conflit de type ne survient.

Migration vers XmlSchemaSet

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

Voici un exemple de code XmlSchemaCollection obsolète.

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 un exemple de code XmlSchemaSet équivalent.

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 à un objet XmlSchemaSet à l'aide de la méthode Add de l'objet XmlSchemaSet. Lorsqu'un schéma est ajouté à un objet XmlSchemaSet, il est associé à un URI d'espace de noms cible. L'URI d'espace de noms cible peut être spécifié sous la forme d'un paramètre pour la méthode Add ou si aucun espace de noms cible n'est spécifié, l'objet XmlSchemaSet utilise l'espace de noms cible défini dans le schéma.

Les schémas sont récupérés à partir d'un objet XmlSchemaSet à l'aide de la propriété Schemas de l'objet XmlSchemaSet. La propriété Schemas de l'objet XmlSchemaSet permet d'itérer sur les objets XmlSchema contenus dans l'objet XmlSchemaSet. La propriété Schemas retourne tous les objets XmlSchema contenus dans l'objet XmlSchemaSet ou, en cas de fourniture d'un paramètre d'espace de noms cible, tous les objets XmlSchema qui appartiennent à l'espace de noms cible. Si null est spécifié comme paramètre d'espace de noms cible, la propriété Schemas retourne tous les schémas sans espace de noms.

L'exemple suivant ajoute le schéma books.xsd de l'espace de noms http://www.contoso.com/books à un objet XmlSchemaSet, récupère tous les schémas qui appartiennent à l'espace de noms http://www.contoso.com/books à partir de l'objet XmlSchemaSet, puis écrit ces schémas dans l'objet 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 objet XmlSchemaSet, voir la méthode Add et la documentation de référence sur la propriété Schemas.

Compilation de schémas

Les schémas d'un objet XmlSchemaSet sont compilés en un seul schéma logique par la méthode Compile de l'objet XmlSchemaSet.

Notes

Contrairement à la classe XmlSchemaCollection obsolète, les schémas ne sont pas compilés lors d'un appel à la méthode Add.

Si la méthode Compile s'exécute correctement, la propriété IsCompiled de l'objet XmlSchemaSet est définie sur true.

Notes

La propriété IsCompiled n'est pas affectée si les schémas sont modifiés dans l'objet XmlSchemaSet. Le suivi des mises à jour des schémas individuels dans l'objet XmlSchemaSet n'est pas assuré. Par conséquent, la propriété IsCompiled peut être true, même si l'un des schémas contenus dans l'objet XmlSchemaSet a été modifié, pour autant qu'aucun schéma n'a été ajouté ou supprimé de l'objet XmlSchemaSet.

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

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 objet XmlSchemaSet, voir la documentation de référence sur la méthode Compile.

Nouveau traitement des schémas

Un nouveau traitement d'un schéma dans un objet XmlSchemaSet effectue toutes les étapes de prétraitement sur un schéma lors d'un appel à la méthode Add de l'objet XmlSchemaSet. Si l'appel à la méthode Reprocess réussit, la propriété IsCompiled de l'objet XmlSchemaSet est définie sur false.

La méthode Reprocess doit être utilisée lorsqu'un schéma de l'objet XmlSchemaSet a été modifié après l'exécution de la compilation par l'objet XmlSchemaSet.

L'exemple suivant illustre le nouveau traitement d'un schéma ajouté à l'objet XmlSchemaSet à l'aide de la méthode Reprocess. Après la compilation de l'objet XmlSchemaSet à l'aide de la méthode Compile et la modification du schéma ajouté à l'objet XmlSchemaSet, la propriété IsCompiled est définie sur true, même si un schéma de l'objet XmlSchemaSet a été modifié. L'appel à la méthode Reprocess exécute l'ensemble du prétraitement effectué par la méthode Add et définit la propriété IsCompiled sur false.

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 un nouveau traitement de schémas dans un objet XmlSchemaSet, voir la documentation de référence sur la méthode Reprocess.

Recherche d'un schéma

La méthode Contains de l'objet XmlSchemaSet peut permettre de vérifier la présence d'un schéma dans un objet XmlSchemaSet. La méthode Contains prend un espace de noms cible ou un objet XmlSchema à rechercher. Dans les deux cas, la méthode Contains retourne true si le schéma est contenu dans l'objet XmlSchemaSet ; sinon, elle retourne false.

Pour plus d'informations sur la recherche d'un schéma, voir la documentation de référence sur la méthode Contains.

Suppression de schémas

Les schémas sont supprimés d'un objet XmlSchemaSet à l'aide des méthodes Remove et RemoveRecursive de l'objet XmlSchemaSet. La méthode Remove supprime le schéma spécifié de l'objet XmlSchemaSet, tandis que la méthode RemoveRecursive supprime le schéma spécifié et tous les schémas importés à partir de l'objet XmlSchemaSet.

L'exemple suivant illustre l'ajout de plusieurs schémas à un objet XmlSchemaSet, puis l'utilisation de la méthode RemoveRecursive pour supprimer l'un des schémas et tous les schémas importés.

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 objet XmlSchemaSet, voir la documentation de référence sur les méthodes Remove et RemoveRecursive.

Résolution de schémas et xs:import

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

Supposez par exemple qu'un objet XmlSchemaSet contienne plusieurs schémas pour l'espace de noms http://www.contoso.com. Un schéma présentant la directive xs:import est ajouté à l'objet XmlSchemaSet.

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

L'objet XmlSchemaSet tente d'importer un schéma pour l'espace de noms http://www.contoso.com en le chargeant à partir de l'URL http://www.contoso.com/schema.xsd. Seuls 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 si d'autres documents de schéma existent pour l'espace de noms http://www.contoso.com dans l'objet XmlSchemaSet. Si le fichier schema.xsd est introuvable à l'URL http://www.contoso.com/schema.xsd, aucun schéma n'est importé dans le schéma d'importation pour l'espace de noms http://www.contoso.com.

Validation de documents XML

Les document XML peuvent être validés par rapport à des schémas dans un objet XmlSchemaSet. Pour valider un document XML, ajoutez un schéma à la propriété XmlSchemaSetSchemas d'un objet XmlReaderSettings, ou ajoutez un objet XmlSchemaSet à la propriété Schemas d'un objet XmlReaderSettings. L'objet XmlReaderSettings est ensuite utilisé par la méthode Create de la classe XmlReader pour créer un objet XmlReader et valider le document XML.

Pour plus d’informations sur la validation de documents XML à l’aide d’un XmlSchemaSet, consultez Validation de schéma XML (XSD) avec XmlSchemaSet.

Voir aussi