System.Xml.Schema.XmlSchemaSet-Klasse

Dieser Artikel enthält ergänzende Hinweise zur Referenzdokumentation für diese API.

Wichtig

  • Verwenden Sie keine Schemas aus unbekannten oder nicht vertrauenswürdigen Quellen oder Speicherorten. Dadurch wird die Sicherheit Ihres Codes beeinträchtigt.
  • XSD-Schemas (auch Inlineschemas) sind von Natur aus anfällig für DoS-Angriffe. Sie sollten sie daher in nicht vertrauenswürdigen Szenarien nicht akzeptieren.
  • Fehlermeldungen und Ausnahmen bei der Schemaüberprüfung können vertrauliche Informationen zum Inhaltsmodell oder zu URI-Pfaden in der Schemadatei verfügbar machen. Achten Sie darauf, diese Informationen nicht für nicht vertrauenswürdige Aufrufer verfügbar zu machen.
  • Zusätzliche Sicherheitsüberlegungen werden im Abschnitt „Sicherheitsüberlegungen“ behandelt.

Bei XmlSchemaSet handelt es sich um einen Cache bzw. eine Bibliothek, in dem bzw. in der Sie XSD-Schemas (XML Schema Definition Language) speichern können. XmlSchemaSet erhöht die Leistungsfähigkeit, indem Schemas im Arbeitsspeicher zwischengespeichert werden, anstatt über eine Datei oder eine URL auf sie zuzugreifen. Jedes Schema wird durch den Namespace-URI und den Speicherort identifiziert, der angegeben wurde, als das Schema dem Satz hinzugefügt wurde. Sie verwenden die XmlReaderSettings.Schemas-Eigenschaft, um das XmlSchemaSet-Objekt zuzuweisen, das ein XML-Reader für die Datenüberprüfung verwenden soll.

Sicherheitshinweise

  • Verwenden Sie keine Schemas aus unbekannten oder nicht vertrauenswürdigen Quellen. Dadurch wird die Sicherheit Ihres Codes beeinträchtigt. Externe Namespaces oder Speicherorte, auf die in include-, import- und redefine-Elementen eines Schemas verwiesen wird, werden im Hinblick auf den Basis-URI des Schemas aufgelöst, das sie enthält oder importiert. Wenn etwa der Basis-URI des einschließenden oder importierenden Schemas leer oder null ist, werden die externen Speicherorte im Hinblick auf das aktuelle Verzeichnis aufgelöst. Die XmlUrlResolver-Klasse wird standardmäßig zur Auflösung externer Schemas verwendet. Um die Auflösung von include-, import- und redefine-Elementen eines Schemas zu deaktivieren, legen Sie die XmlSchemaSet.XmlResolver-Eigenschaft auf null fest.

  • Die XmlSchemaSet-Klasse verwendet die System.Text.RegularExpressions.Regex-Klasse, um reguläre Ausdrücke in einem XML-Schema zu analysieren und abzugleichen. Die Überprüfung von Musterfacet mit regulären Ausdrücken in einem XML-Schema kann zu einer erhöhten CPU-Auslastung führen und sollte in Hochverfügbarkeitsszenarien vermieden werden.

  • Ausnahmen, die aufgrund der Verwendung der XmlSchemaSet-Klasse (etwa der XmlSchemaException-Klasse) ausgelöst werden, enthalten möglicherweise vertrauliche Informationen, die in nicht vertrauenswürdigen Szenarien nicht verfügbar gemacht werden sollten. Beispielsweise gibt die SourceUri-Eigenschaft eines XmlSchemaException-Elements den URI-Pfad zur Schemadatei zurück, die die Ausnahme verursacht hat. Die SourceUri-Eigenschaft sollte in nicht vertrauenswürdigen Szenarien nicht verfügbar gemacht werden. Ausnahmen müssen ordnungsgemäß behandelt werden, damit diese vertraulichen Informationen in nicht vertrauenswürdigen Szenarien nicht verfügbar gemacht werden.

Beispiele

Im folgenden Beispiel wird eine XML-Datei mithilfe von im XmlSchemaSet gespeicherten Schemata validiert. Der Namespace in der XML-Datei, urn:bookstore-schema, gibt an, welches Schema im XmlSchemaSet zur Validierung verwendet werden soll. Die Ausgabe aus dem Beispiel zeigt, dass bei der XML-Datei zwei Schemaverstöße vorliegen:

  • Das erste <book>-Element enthält ein <author>-Element, aber kein <title>- oder <price>-Element.

  • Im <author>-Element im letzten <book>-Element fehlen ein <first-name>- und ein <last-name>-Element, stattdessen ist ein ungültiges <name>-Element enthalten.

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

Eingabe

In diesem Beispiel werden die folgenden beiden Eingabedateien verwendet:

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>