System.Xml.Schema.XmlSchemaSet, klasa
Ten artykuł zawiera dodatkowe uwagi dotyczące dokumentacji referencyjnej dla tego interfejsu API.
Ważne
- Nie używaj schematów z nieznanych lub niezaufanych źródeł ani lokalizacji. Spowoduje to naruszenie zabezpieczeń kodu.
- Schematy XML (w tym schematy wbudowane) są z natury narażone na ataki typu "odmowa usługi"; nie akceptuj ich w niezaufanych scenariuszach.
- Komunikaty o błędach weryfikacji schematu i wyjątki mogą uwidaczniać poufne informacje o ścieżce con tryb namiotu l lub URI do pliku schematu. Należy zachować ostrożność, aby nie ujawniać tych informacji niezaufanym obiektom wywołującym.
- Dodatkowe zagadnienia dotyczące zabezpieczeń zostały omówione w sekcji "Zagadnienia dotyczące zabezpieczeń".
XmlSchemaSet to pamięć podręczna lub biblioteka, w której można przechowywać schematy języka definicji schematu XML (XSD). XmlSchemaSet Poprawia wydajność, buforując schematy w pamięci zamiast uzyskiwać do nich dostęp z pliku lub adresu URL. Każdy schemat jest identyfikowany przez identyfikator URI przestrzeni nazw i lokalizację, która została określona podczas dodawania schematu do zestawu. Właściwość służy XmlReaderSettings.Schemas do przypisywania XmlSchemaSet obiektu, którego czytelnik XML powinien używać do sprawdzania poprawności danych.
Zagadnienia dotyczące zabezpieczeń
Nie używaj schematów z nieznanych lub niezaufanych źródeł. Spowoduje to naruszenie zabezpieczeń kodu. Zewnętrzne przestrzenie nazw lub lokalizacje, do których odwołuje się odwołanie, obejmują, importowanie i ponowne definiowanie elementów schematu są rozpoznawane w odniesieniu do podstawowego identyfikatora URI schematu, który zawiera lub importuje je. Jeśli na przykład podstawowy identyfikator URI schematu dołączania lub importowania jest pusty lub
null
lokalizacje zewnętrzne są rozpoznawane w odniesieniu do bieżącego katalogu. Klasa XmlUrlResolver jest używana do rozpoznawania schematów zewnętrznych domyślnie. Aby wyłączyć rozpoznawanie elementów dołączania, importowania i ponownego definiowania elementów schematu, ustaw XmlSchemaSet.XmlResolver właściwość nanull
.Klasa XmlSchemaSet używa System.Text.RegularExpressions.Regex klasy do analizowania i dopasowywania wyrażeń regularnych w schemacie XML. Walidacja aspektów wzorców z wyrażeniami regularnymi w schemacie XML może obejmować zwiększone użycie procesora CPU i należy unikać w scenariuszach wysokiej dostępności.
Wyjątki zgłaszane w wyniku użycia XmlSchemaSet klasy, takie jak XmlSchemaException klasa, mogą zawierać poufne informacje, które nie powinny być widoczne w niezaufanych scenariuszach. Na przykład SourceUri właściwość obiektu XmlSchemaException zwraca ścieżkę identyfikatora URI do pliku schematu, który spowodował wyjątek. Właściwość SourceUri nie powinna być widoczna w niezaufanych scenariuszach. Wyjątki powinny być prawidłowo obsługiwane, aby te poufne informacje nie były widoczne w niezaufanych scenariuszach.
Przykłady
Poniższy przykład weryfikuje plik XML przy użyciu schematów przechowywanych w pliku XmlSchemaSet. Przestrzeń nazw w pliku urn:bookstore-schema
XML określa schemat używany do XmlSchemaSet walidacji. Dane wyjściowe z przykładu pokazują, że plik XML ma dwa naruszenia schematu:
Pierwszy <element książki> zawiera element autora>, <ale nie <zawiera żadnego tytułu> ani <elementu ceny>.
Element <author> w ostatnim <elemecie książki> nie ma <elementu imię i nazwisko>>, <a zamiast tego ma nieprawidłowy <element name>.
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'.
Dane wejściowe
W przykładzie użyto następujących dwóch plików wejściowych.
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>