Classe System.Xml.Schema.XmlSchemaSet

Cet article vous offre des remarques complémentaires à la documentation de référence pour cette API.

Important

  • N’utilisez aucun schéma provenant de sources ou d’emplacements inconnus ou non approuvés. Cela va compromettre la sécurité de votre code.
  • Les schémas XSD (notamment les schémas en ligne), sont par nature vulnérables aux attaques par déni de service. N’acceptez aucun schéma provenant de scénarios non approuvées.
  • 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 de sécurité ».

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

Considérations de sécurité

  • N’utilisez aucun schéma provenant de sources inconnues ou non approuvées. Cela va compromettre la sécurité de votre code. Les espaces de noms externes ou les emplacements 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 contient ou importe ces éléments. Par exemple, si l’URI de base du schéma d’inclusion ou d’importation est vide ou avec pour valeur null, les emplacements externes sont résolus par rapport au répertoire actuel. La classe XmlUrlResolver sert à résoudre les schémas externes par défaut. Pour désactiver la résolution des éléments « include », import et redéfinissez un schéma, affectez à la propriété XmlSchemaSet.XmlResolver la valeur null.

  • La classe XmlSchemaSet utilise la classe System.Text.RegularExpressions.Regex 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 des scénarios de haute disponibilité.

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

Exemples

L'exemple suivant valide un fichier XML à l'aide des schémas stockés dans l'objet 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 élément <livre> contient un élément <auteur>, mais aucun <titre> ni élément <prix>.

  • L’élément >auteur< du dernier élément <livre> a un manque d’éléments <prénom> et <nom de famille> et possède plutôt un élément <nom> 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'.

Input

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>