Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dieser Artikel enthält ergänzende Hinweise zur Referenzdokumentation für diese API.
Von Bedeutung
- Verwenden Sie keine Schemas aus unbekannten oder nicht vertrauenswürdigen Quellen oder Speicherorten. Dadurch wird die Sicherheit Ihres Codes beeinträchtigt.
- XML-Schemas (einschließlich Inlineschemas) sind inhärent anfällig für Denial-of-Service-Angriffe; nehmen Sie sie in nicht vertrauenswürdigen Szenarien nicht an.
- Schemaüberprüfungsfehlermeldungen und Ausnahmen können vertrauliche Informationen über das Inhaltsmodell oder URI-Pfade für die 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.
XmlSchemaSet ist ein Cache oder eine Bibliothek, in dem Sie XML-Schemadefinitionssprachenschemas (XSD)-Schemas speichern können. XmlSchemaSet verbessert die Leistung, indem Schemas im Arbeitsspeicher zwischengespeichert werden, anstatt von einer Datei oder einer URL darauf zuzugreifen. Jedes Schema wird durch den Namespace-URI und den Speicherort identifiziert, der beim Hinzufügen des Schemas zum Satz angegeben wurde. Sie verwenden die XmlReaderSettings.Schemas Eigenschaft, um das Objekt zuzuweisen, das XmlSchemaSet ein XML-Reader für die Datenüberprüfung verwenden soll.
Sicherheitsüberlegungen
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 den Elementen include, import und redefine eines Schemas verwiesen wird, werden in Bezug auf den Basis-URI des Schemas aufgelöst, das sie umfasst 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 verwendet, um externe Schemas standardmäßig aufzulösen. Um die Auflösung von Einschließen-, Import- und Neudefinierungselementen eines Schemas zu deaktivieren, legen Sie die XmlSchemaSet.XmlResolver Eigenschaft aufnull
.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 Muster-Facets mit regulären Ausdrücken in einem XML-Schema kann zu einer erhöhten CPU-Auslastung führen und sollte in Szenarien mit hoher Verfügbarkeit vermieden werden.
Ausnahmen, die aufgrund der Verwendung der XmlSchemaSet Klasse ausgelöst werden, z. B. die XmlSchemaException Klasse, enthalten möglicherweise vertrauliche Informationen, die in nicht vertrauenswürdigen Szenarien nicht verfügbar gemacht werden sollten. Beispielsweise gibt die SourceUri-Eigenschaft eines XmlSchemaException 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 sollten 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 Schemas überprüft, die in der XmlSchemaSetDatei gespeichert sind. Der Namespace in der XML-Datei urn:bookstore-schema
identifiziert, welches Schema in der XmlSchemaSet zur Validierung verwendet werden soll. Die Ausgabe aus dem Beispiel zeigt, dass die XML-Datei zwei Schemaverstöße aufweist:
Das erste <Buchelement> enthält ein <Author-Element> , aber kein <Titel> - oder <Preiselement> .
Das <Author-Element> im letzten <Buchelement> fehlt ein <Vor-> und <Nachnamenelement> und weist stattdessen ein ungültiges <Namenselement> auf.
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
Im 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>