Класс System.Xml.Schema.XmlSchemaSet
В этой статье приводятся дополнительные замечания к справочной документации по этому API.
Важно!
- Не используйте схемы из неизвестных или ненадежных источников или расположений. Это приведет к компрометации безопасности кода.
- XML-схемы (включая встроенные схемы) по сути уязвимы для атак типа "отказ в обслуживании"; Не принимать их в ненадежных сценариях.
- Сообщения об ошибках проверки схемы и исключения могут предоставлять конфиденциальные сведения о пути con режим палатки l или URI к файлу схемы. Будьте осторожны, чтобы не предоставлять эту информацию ненадежным вызывающим абонентам.
- Дополнительные вопросы безопасности рассматриваются в разделе "Вопросы безопасности".
XmlSchemaSet — это кэш или библиотека, в которой можно хранить схемы языка определения XML-схемы (XSD). XmlSchemaSet повышает производительность путем кэширования схем в памяти вместо доступа к ним из файла или URL-адреса. Каждая схема определяется URI пространства имен и расположением, указанными при добавлении схемы в набор. Свойство используется XmlReaderSettings.Schemas для назначения XmlSchemaSet объекта средство чтения XML, которое должно использоваться для проверки данных.
Вопросы безопасности
Не используйте схемы из неизвестных или ненадежных источников. Это приведет к компрометации безопасности кода. Внешние пространства имен или расположения, на которые ссылаются включаемые, импорт и переопределенные элементы схемы, разрешаются в отношении базового URI схемы, которая включает или импортирует их. Например, если базовый универсальный код ресурса (URI) включающего или импорта схемы пуст или
null
внешние расположения разрешаются в отношении текущего каталога. Класс XmlUrlResolver используется для разрешения внешних схем по умолчанию. Чтобы отключить разрешение включения, импорта и переопределить элементы схемы, задайте XmlSchemaSet.XmlResolver для свойстваnull
значение .Класс XmlSchemaSet использует System.Text.RegularExpressions.Regex класс для синтаксического анализа и сопоставления регулярных выражений в схеме XML. Проверка аспектов шаблона с регулярными выражениями в схеме XML может включать увеличение использования ЦП и следует избегать в сценариях высокой доступности.
Исключения, возникающие в результате использования XmlSchemaSet класса, например XmlSchemaException класса, могут содержать конфиденциальную информацию, которая не должна предоставляться в ненадежных сценариях. Например, SourceUri свойство XmlSchemaException URI возвращает путь URI к файлу схемы, вызвавшего исключение. Свойство SourceUri не должно быть предоставлено в ненадежных сценариях. Исключения должны обрабатываться должным образом, чтобы эта конфиденциальная информация не предоставлялась в ненадежных сценариях.
Примеры
В следующем примере XML-файл проверяется с использованием схем, хранимых в классе XmlSchemaSet. Пространство имен в XML-файле, urn:bookstore-schema
, идентифицирует схему в классе XmlSchemaSet для использования при проверке. Выходные данные из примера показывают, что XML-файл имеет два нарушения схемы:
Первый <элемент книги><содержит элемент author> , но не <элемент title> или <price> .
Элемент <author> в последнем <элементе книги><отсутствует элемент first-name> и <last-name> , а вместо этого имеет недопустимый <элемент 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'.
Входные данные
Образец использует следующие два входных файла.
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>
book.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>