Classe System.Xml.Schema.XmlSchemaSet

Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.

Importante

  • Non usare schemi da origini o percorsi sconosciuti o non attendibili. In questo modo verrà compromessa la sicurezza del codice.
  • Gli XML Schema (inclusi gli schemi inline) sono intrinsecamente vulnerabili agli attacchi Denial of Service; non accettarli in scenari non attendibili.
  • I messaggi di errore di convalida dello schema e le eccezioni possono esporre informazioni riservate sui percorsi con modalità tenda l o URI al file di schema. Prestare attenzione a non esporre queste informazioni ai chiamanti non attendibili.
  • Altre considerazioni sulla sicurezza sono illustrate nella sezione "Considerazioni sulla sicurezza".

XmlSchemaSet è una cache o una libreria in cui è possibile archiviare schemi XSD (XML Schema Definition Language). XmlSchemaSet migliora le prestazioni memorizzando nella cache gli schemi in memoria anziché accedervi da un file o da un URL. Ogni schema viene identificato dall'URI dello spazio dei nomi e dal percorso specificato quando lo schema è stato aggiunto al set. Utilizzare la XmlReaderSettings.Schemas proprietà per assegnare l'oggetto che XmlSchemaSet un lettore XML deve utilizzare per la convalida dei dati.

Considerazioni sulla sicurezza

  • Non usare schemi da origini sconosciute o non attendibili. In questo modo verrà compromessa la sicurezza del codice. Gli spazi dei nomi esterni o i percorsi a cui si fa riferimento in includono, importare e ridefinire gli elementi di uno schema vengono risolti in relazione all'URI di base dello schema che li include o li importa. Ad esempio, se l'URI di base dello schema di inclusione o importazione è vuoto o null, i percorsi esterni vengono risolti rispetto alla directory corrente. La XmlUrlResolver classe viene usata per risolvere gli schemi esterni per impostazione predefinita. Per disabilitare la risoluzione di elementi di inclusione, importazione e ridefinizione di uno schema, impostare la XmlSchemaSet.XmlResolver proprietà su null.

  • La XmlSchemaSet classe usa la System.Text.RegularExpressions.Regex classe per analizzare e trovare le corrispondenze con le espressioni regolari in uno schema XML. La convalida dei facet del modello con espressioni regolari in un XML Schema può comportare un aumento dell'utilizzo della CPU e deve essere evitata in scenari a disponibilità elevata.

  • Le eccezioni generate in seguito all'uso della XmlSchemaSet classe , ad esempio la XmlSchemaException classe , possono contenere informazioni riservate che non devono essere esposte in scenari non attendibili. Ad esempio, la SourceUri proprietà di un XmlSchemaException oggetto restituisce il percorso dell'URI al file di schema che ha causato l'eccezione. La SourceUri proprietà non deve essere esposta in scenari non attendibili. Le eccezioni devono essere gestite correttamente in modo che queste informazioni riservate non vengano esposte in scenari non attendibili.

Esempi

Nell'esempio seguente un file XML viene convalidato utilizzando gli schemi memorizzati in XmlSchemaSet. Lo spazio dei nomi nel file XML, urn:bookstore-schema, consente di identificare gli schemi in XmlSchemaSet da utilizzare per la convalida. L'output dell'esempio mostra che il file XML presenta due violazioni dello schema:

  • Il primo <elemento libro> contiene un <elemento autore> , ma nessun <titolo> o <elemento prezzo> .

  • L'elemento <author> nell'ultimo <elemento book> manca un nome> e <un <elemento cognome> e ha invece un elemento name> non valido<.

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

Nell'esempio vengono utilizzati i seguenti due file di input:

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>