Partager via


Classe System.Xml.Schema.XmlSchemaSet

Cet article fournit des remarques supplémentaires à la documentation de référence de cette API.

Importante

  • N’utilisez pas de schémas provenant de sources ou d’emplacements inconnus ou non approuvés. Cela compromettra la sécurité de votre code.
  • Les schémas XML (y compris les schémas inline) sont intrinsèquement vulnérables aux attaques par déni de service ; ne les acceptent pas dans des scénarios non approuvés.
  • Les messages d’erreur de validation de schéma et les exceptions peuvent exposer des informations sensibles sur le modèle de contenu ou les chemins d’URI du fichier de schéma. Veillez à ne pas exposer ces informations aux appelants non approuvés.
  • Des considérations de sécurité supplémentaires sont abordées dans la section « Considérations relatives à la sécurité ».

XmlSchemaSet est un cache ou une bibliothèque où vous pouvez stocker des schémas XSD (XML Schema Definition Language). XmlSchemaSet améliore les performances en mettant en cache les schémas en mémoire au lieu de les accéder à partir d’un fichier ou d’une URL. Chaque schéma est identifié par l'URI et l'emplacement de l'espace de noms spécifiés lors de l'ajout du schéma à l'ensemble. Vous utilisez la XmlReaderSettings.Schemas propriété pour affecter l’objet XmlSchemaSet qu’un lecteur XML doit utiliser pour la validation des données.

Considérations relatives à la sécurité

  • N’utilisez pas de schémas provenant de sources inconnues ou non approuvées. Cela compromettra la sécurité de votre code. Les espaces de noms ou emplacements externes référencés dans les éléments include, import et redefine d’un schéma sont résolus par rapport à l’URI de base du schéma qui les inclut ou les importe. Par exemple, si l’URI de base du schéma d’inclusion ou d’importation est vide ou null, les emplacements externes sont résolus par rapport au répertoire actuel. La XmlUrlResolver classe est utilisée pour résoudre les schémas externes par défaut. Pour désactiver la résolution des éléments d’un schéma d’inclusion, d’importation et redéfinition, définissez la propriété XmlSchemaSet.XmlResolver sur null.

  • La XmlSchemaSet classe utilise la System.Text.RegularExpressions.Regex classe pour analyser et faire correspondre les expressions régulières dans un schéma XML. La validation des facettes de modèle avec des expressions régulières dans un schéma XML peut impliquer une utilisation accrue du processeur et doit être évitée dans les scénarios de haute disponibilité.

  • Les exceptions levées suite à l’utilisation de la XmlSchemaSet classe, telles que la XmlSchemaException classe, peuvent contenir des informations sensibles qui ne doivent pas être exposées dans des scénarios non approuvés. Par exemple, la SourceUri propriété d’un XmlSchemaException retourne le chemin URI vers le fichier de schéma à l'origine de l’exception. La propriété SourceUri ne doit pas être exposée dans des scénarios non fiables. Les exceptions doivent être gérées correctement afin que ces informations sensibles ne soient pas exposées dans des scénarios non approuvés.

Exemples

L’exemple suivant valide un fichier XML à l’aide de schémas stockés dans le XmlSchemaSet. L'espace de noms dans le fichier XML, urn:bookstore-schema, identifie le schéma dans l'objet XmlSchemaSet à utiliser pour la validation. La sortie de l’exemple montre que le fichier XML présente deux violations de schéma :

  • Le premier <book> élément contient un <author> élément, mais aucun <title> ou <price> élément.

  • L’élément <author> dans le dernier <book> élément manque un élément <first-name> et <last-name> et contient à la place un élément <name> non valide.

using System;
using System.Xml;
using System.Xml.Schema;
using System.IO;

public class Sample
{
  public static void Main() {

    // Create the XmlSchemaSet class.
    XmlSchemaSet sc = new XmlSchemaSet();

    // Add the schema to the collection.
    sc.Add("urn:bookstore-schema", "books.xsd");

    // Set the validation settings.
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.ValidationType = ValidationType.Schema;
    settings.Schemas = sc;
    settings.ValidationEventHandler += ValidationCallBack;

    // Create the XmlReader object.
    XmlReader reader = XmlReader.Create("booksSchemaFail.xml", settings);

    // Parse the file.
    while (reader.Read());
  }

  // Display any validation errors.
  private static void ValidationCallBack(object sender, ValidationEventArgs e) {
    Console.WriteLine($"Validation Error:\n   {e.Message}\n");
  }
}
// The example displays output like the following:
//   Validation Error:
//        The element 'book' in namespace 'urn:bookstore-schema' has invalid child element 'author'
//        in namespace 'urn:bookstore-schema'. List of possible elements expected: 'title' in
//        namespace 'urn:bookstore-schema'.
//
//    Validation Error:
//       The element 'author' in namespace 'urn:bookstore-schema' has invalid child element 'name'
//       in namespace 'urn:bookstore-schema'. List of possible elements expected: 'first-name' in
//       namespace 'urn:bookstore-schema'.
Imports System.Xml
Imports System.Xml.Schema
Imports System.IO

Public Module Sample 
  Public Sub Main() 

    ' Create the XmlSchemaSet class.
    Dim sc as XmlSchemaSet = new XmlSchemaSet()

    ' Add the schema to the collection.
    sc.Add("urn:bookstore-schema", "books.xsd")

    ' Set the validation settings.
    Dim settings as XmlReaderSettings = new XmlReaderSettings()
    settings.ValidationType = ValidationType.Schema
    settings.Schemas = sc
    AddHandler settings.ValidationEventHandler, AddressOf ValidationCallBack
 
    ' Create the XmlReader object.
    Dim reader as XmlReader = XmlReader.Create("booksSchemaFail.xml", settings)

    ' Parse the file. 
    While reader.Read()
    End While
    
  End Sub

  ' Display any validation errors.
  Private Sub ValidationCallBack(sender as object, e as ValidationEventArgs) 
    Console.WriteLine($"Validation Error:{vbCrLf}   {e.Message}")
    Console.WriteLine()
  End Sub
End Module
' The example displays output like the following:
'   Validation Error: 
'        The element 'book' in namespace 'urn:bookstore-schema' has invalid child element 'author' 
'        in namespace 'urn:bookstore-schema'. List of possible elements expected: 'title' in 
'        namespace 'urn:bookstore-schema'.
'
'    Validation Error: 
'       The element 'author' in namespace 'urn:bookstore-schema' has invalid child element 'name' 
'       in namespace 'urn:bookstore-schema'. List of possible elements expected: 'first-name' in 
'       namespace 'urn:bookstore-schema'.

Entrée

L’exemple utilise les deux fichiers d’entrée suivants.

booksSchemaFail.xml:

<?xml version='1.0'?>
<bookstore xmlns="urn:bookstore-schema">
  <book>
    <author>
      <first-name>Benjamin</first-name>
      <last-name>Franklin</last-name>
    </author>
  </book>
  <book genre="novel">
    <title>The Confidence Man</title>
    <author>
      <first-name>Herman</first-name>
      <last-name>Melville</last-name>
    </author>
    <price>11.99</price>
  </book>
  <book genre="philosophy">
    <title>The Gorgias</title>
    <author>
      <name>Plato</name>
    </author>
    <price>9.99</price>
  </book>
</bookstore>

books.xsd :

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns="urn:bookstore-schema"
    elementFormDefault="qualified"
    targetNamespace="urn:bookstore-schema">

 <xsd:element name="bookstore" type="bookstoreType"/>

 <xsd:complexType name="bookstoreType">
  <xsd:sequence maxOccurs="unbounded">
   <xsd:element name="book"  type="bookType"/>
  </xsd:sequence>
 </xsd:complexType>

 <xsd:complexType name="bookType">
  <xsd:sequence>
   <xsd:element name="title" type="xsd:string"/>
   <xsd:element name="author" type="authorName"/>
   <xsd:element name="price"  type="xsd:decimal"/>
  </xsd:sequence>
  <xsd:attribute name="genre" type="xsd:string"/>
 </xsd:complexType>

 <xsd:complexType name="authorName">
  <xsd:sequence>
   <xsd:element name="first-name"  type="xsd:string"/>
   <xsd:element name="last-name" type="xsd:string"/>
  </xsd:sequence>
 </xsd:complexType>

</xsd:schema>