System.Xml.Schema.XmlSchemaSet-klass

Anmärkning

Den här artikeln innehåller ytterligare kommentarer till referensdokumentationen för det här API:et.

Viktigt!

  • Använd inte scheman från okända eller ej betrodda källor eller platser. Om du gör det äventyras säkerheten för koden.
  • XML-scheman (inklusive infogade scheman) är i sig sårbara för överbelastningsattacker. acceptera dem inte i ej betrodda scenarier.
  • Felmeddelanden och undantag för schemavalidering kan exponera känslig information om innehållsmodellen eller URI-sökvägar till schemafilen. Var noga med att inte exponera den här informationen för ej betrodda uppringare.
  • Ytterligare säkerhetsöverväganden beskrivs i avsnittet "Säkerhetsöverväganden".

XmlSchemaSet är en cache eller ett bibliotek där du kan lagra XSD-scheman (XML Schema Definition Language). XmlSchemaSet förbättrar prestanda genom att cachelagra scheman i minnet i stället för att komma åt dem från en fil eller en URL. Varje schema identifieras av den namnområdes-URI och plats som angavs när schemat lades till i uppsättningen. Du använder XmlReaderSettings.Schemas egenskapen för att tilldela det XmlSchemaSet objekt som en XML-läsare ska använda för dataverifiering.

Säkerhetsfrågor

  • Använd inte scheman från okända eller ej betrodda källor. Om du gör det äventyras säkerheten för koden. Externa namnrymder eller platser som refereras till i inkluderade, importerade och omdefinierade element i ett schema löses i förhållande till bas-URI:n för det schema som innehåller eller importerar dem. Om till exempel bas-URI:n för inkluderande eller importerande schema är tom eller null, löses de externa platserna med hänsyn till den aktuella katalogen. Klassen XmlUrlResolver används för att matcha externa scheman som standard. Om du vill inaktivera upplösningen för inkludera, importera och omdefiniera element i XmlSchemaSet.XmlResolver ett schema anger du egenskapen till null.

  • Klassen XmlSchemaSet använder System.Text.RegularExpressions.Regex klassen för att parsa och matcha reguljära uttryck i ett XML-schema. Validering av mönsterfasetter med reguljära uttryck i ett XML-schema kan innebära ökad CPU-användning och bör undvikas i scenarier med hög tillgänglighet.

  • Undantag som uppstår till följd av att klassen används XmlSchemaSet , till exempel XmlSchemaException klassen, kan innehålla känslig information som inte ska exponeras i obetrodda scenarier. Till exempel returnerar SourceUri-egenskapen hos en XmlSchemaException URI-sökvägen till schemafilen som orsakade undantaget. Egenskapen SourceUri ska inte exponeras i ej betrodda scenarier. Undantag bör hanteras korrekt så att den här känsliga informationen inte exponeras i obetrodda scenarier.

Exempel

I följande exempel verifieras en XML-fil med hjälp av scheman XmlSchemaSetsom lagras i . Namnområdet i XML-filen , urn:bookstore-schemaidentifierar vilket schema som XmlSchemaSet ska användas för validering. Utdata från exemplet visar att XML-filen har två schemaöverträdelser:

  • Det första <book> elementet innehåller ett <author> element men inget <title> eller <price> element.

  • Elementet <author> i det sista <book> elementet saknar ett <first-name> och-element <last-name> och har i stället ett ogiltigt <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'.

Inmatning

Exemplet använder följande två indatafiler.

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>