Klasse System.Xml.Schema.XmlSchemaSet

Opmerking

In dit artikel vindt u aanvullende opmerkingen in de referentiedocumentatie voor deze API.

Belangrijk

  • Gebruik geen schema's van onbekende of niet-vertrouwde bronnen of locaties. Als u dit doet, wordt de beveiliging van uw code aangetast.
  • XML-schema's (inclusief inlineschema's) zijn inherent kwetsbaar voor Denial of Service-aanvallen; accepteer ze niet in niet-vertrouwde scenario's.
  • Foutberichten en uitzonderingen voor schemavalidatie kunnen gevoelige informatie over het inhoudsmodel of URI-paden naar het schemabestand beschikbaar maken. Wees voorzichtig met het niet beschikbaar maken van deze informatie aan niet-vertrouwde bellers.
  • Aanvullende beveiligingsoverwegingen worden behandeld in de sectie Beveiligingsoverwegingen.

XmlSchemaSet is een cache of bibliotheek waarin u XSD-schema's (XML Schema Definition Language) kunt opslaan. XmlSchemaSet verbetert de prestaties door schema's in het geheugen in cache op te slaan in plaats van ze te openen vanuit een bestand of een URL. Elk schema wordt geïdentificeerd door de naamruimte-URI en locatie die is opgegeven toen het schema aan de set werd toegevoegd. U gebruikt de XmlReaderSettings.Schemas eigenschap om het XmlSchemaSet object toe te wijzen dat een XML-lezer moet gebruiken voor gegevensvalidatie.

Beveiligingsoverwegingen

  • Gebruik geen schema's van onbekende of niet-vertrouwde bronnen. Als u dit doet, wordt de beveiliging van uw code aangetast. Externe naamruimten of locaties waarnaar wordt verwezen in opnemen, importeren en opnieuw definiëren van elementen van een schema, worden opgelost met betrekking tot de basis-URI van het schema dat deze bevat of importeert. Als de basis-URI van het opname- of importschema bijvoorbeeld leeg is of null, worden de externe locaties opgelost met betrekking tot de huidige map. De XmlUrlResolver klasse wordt standaard gebruikt om externe schema's op te lossen. Als u de oplossing van opnemen, importeren en opnieuw definiëren van elementen van een schema wilt uitschakelen, stelt u de XmlSchemaSet.XmlResolver eigenschap in op null.

  • De XmlSchemaSet klasse gebruikt de System.Text.RegularExpressions.Regex klasse om reguliere expressies in een XML-schema te parseren en te vergelijken. Validatie van patroon facets met reguliere expressies in een XML-schema kan leiden tot een verhoogd CPU-gebruik en moet worden vermeden in scenario's met hoge beschikbaarheid.

  • Uitzonderingen die worden gegenereerd als gevolg van het gebruik van de XmlSchemaSet klasse, zoals de XmlSchemaException klasse, kunnen gevoelige informatie bevatten die niet mag worden weergegeven in niet-vertrouwde scenario's. De SourceUri eigenschap van een XmlSchemaException object retourneert bijvoorbeeld het URI-pad naar het schemabestand dat de uitzondering heeft veroorzaakt. De SourceUri eigenschap mag niet worden weergegeven in niet-vertrouwde scenario's. Uitzonderingen moeten correct worden afgehandeld, zodat deze gevoelige informatie niet wordt weergegeven in niet-vertrouwde scenario's.

Voorbeelden

In het volgende voorbeeld wordt een XML-bestand gevalideerd met behulp van schema's die zijn opgeslagen in de XmlSchemaSet. De naamruimte in het XML-bestand, urn:bookstore-schema, bepaalt welk schema in het XmlSchemaSet wordt gebruikt voor validatie. Uitvoer uit het voorbeeld laat zien dat het XML-bestand twee schemaschendingen heeft:

  • Het eerste <book> element bevat een <author> element, maar geen <title> element of <price> element.

  • Het <author> element in het laatste <book> element ontbreekt en <first-name><last-name> bevat in plaats daarvan een ongeldig <name> element.

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'.

Invoer

In het voorbeeld worden de volgende twee invoerbestanden gebruikt.

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>