XmlSchemaSet для компиляции схемы
Описывает класс XmlSchemaSet, который представляет собой кэш, в котором можно хранить и проверять схемы XSD.
Класс XmlSchemaSet
Класс XmlSchemaSet - это кэш, в котором можно хранить и проверять схемы XSD.
В System.Xml версии 1.0 схемы XML загружались в класс XmlSchemaCollection как в библиотеку схем. В System.Xml версии 2.0 классы XmlValidatingReader и XmlSchemaCollection устарели и были заменены методами Create и классом XmlSchemaSet, соответственно.
Класс XmlSchemaSet был введен, чтобы устранить ряд проблем, в том числе совместимости со стандартами, производительности и устаревшего формата схемы Microsoft XDR.
Ниже дано сравнение класса XmlSchemaCollection с классом XmlSchemaSet.
XmlSchemaCollection | XmlSchemaSet |
---|---|
Поддерживает схемы Microsoft XDR и W3C XML. | Поддерживает только схемы W3C XML. |
Схемы компилируются при вызове метода Add. | Схемы не компилируются при вызове метода Add. В результате повышается производительность при создании библиотеки схем. |
Каждая схема создает отдельную скомпилированную версию, которая может привести к "островам схемы". В результате все элементы включают и импортируются область только в этой схеме. | Скомпилированные схемы формируют единую логическую схему, «набор» схем. Любые импортированные схемы внутри схемы, добавленные в набор, сами напрямую добавляются в набор. Это означает, что все типы доступны всем схемам. |
Для определенного целевого пространства имен в коллекции может существовать только одна схема. | Для одного целевого пространства имен может быть добавлено несколько схем, если не возникает конфликтов типов. |
Переход на класс XmlSchemaSet
В следующем примере кода даны инструкции по переходу на новый класс XmlSchemaSet с устаревшего класса XmlSchemaCollection. В примере кода показаны следующие важные различия между двумя классами.
В отличие от метода Add класса XmlSchemaCollection, при вызове метода Add класса XmlSchemaSet схемы не компилируются. В примере кода явно вызывается метод Compile класса XmlSchemaSet.
Для итераций по классу XmlSchemaSet необходимо использовать свойство Schemas класса XmlSchemaSet.
Пример устаревшего кода с классом XmlSchemaCollection.
Dim schemaCollection As XmlSchemaCollection = New XmlSchemaCollection()
schemaCollection.Add("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd")
schemaCollection.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd")
Dim schema As XmlSchema
For Each schema in schemaCollection
Console.WriteLine(schema.TargetNamespace)
Next
XmlSchemaCollection schemaCollection = new XmlSchemaCollection();
schemaCollection.Add("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd");
schemaCollection.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd");
foreach(XmlSchema schema in schemaCollection)
{
Console.WriteLine(schema.TargetNamespace);
}
Пример эквивалентного кода с классом XmlSchemaSet.
Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()
schemaSet.Add("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd")
schemaSet.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd")
schemaSet.Compile()
Dim schema As XmlSchema
For Each schema in schemaSet.Schemas()
Console.WriteLine(schema.TargetNamespace)
Next
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd");
schemaSet.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd");
schemaSet.Compile();
foreach(XmlSchema schema in schemaSet.Schemas())
{
Console.WriteLine(schema.TargetNamespace);
}
Добавление и получение схем
Схемы добавляются к классу XmlSchemaSet с помощью метода Add класса XmlSchemaSet. Когда схема добавляется в класс XmlSchemaSet, она связывается с URI-кодом целевого пространства имен. URI-код целевого пространства имен указывается как параметр метода Add, или, если целевое пространство имен не задано, класс XmlSchemaSet использует целевое пространство имен, определенное в схеме.
Схемы получаются из класса XmlSchemaSet с помощью свойства Schemas класса XmlSchemaSet. Свойство Schemas класса XmlSchemaSet позволяет выполнить итерацию по объектам XmlSchema, содержащимся в классе XmlSchemaSet. Свойство Schemas возвращает все объекты XmlSchema, содержащиеся в классе XmlSchemaSet, или, при указании параметра целевого пространства имен, возвращает все объекты XmlSchema, которые принадлежат целевому пространству имен. Если в качестве параметра целевого пространства имен указано null
, свойство Schemas возвращает все схемы без пространства имен.
В следующем примере схема books.xsd
из пространства имен http://www.contoso.com/books
добавляется в класс XmlSchemaSet, затем из класса http://www.contoso.com/books
получаются все схемы, принадлежащие к пространству имен XmlSchemaSet, и записываются в объект Console.
Dim schemaSet As XmlSchemaSet = New XmlSchemaSet
schemaSet.Add("http://www.contoso.com/books", "books.xsd")
Dim schema As XmlSchema
For Each schema In schemaSet.Schemas("http://www.contoso.com/books")
schema.Write(Console.Out)
Next
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add("http://www.contoso.com/books", "books.xsd");
foreach (XmlSchema schema in schemaSet.Schemas("http://www.contoso.com/books"))
{
schema.Write(Console.Out);
}
Дополнительные сведения о добавлении и извлечении схем из класса XmlSchemaSet см. в справочной документации по методу Add и свойству Schemas.
Компиляция схем
Схемы в классе XmlSchemaSet компилируются в одну логическую схему с помощью метода Compile класса XmlSchemaSet.
Примечание.
В отличие от устаревшего класса XmlSchemaCollection, при вызове метода Add схемы не компилируются.
Если метод Compile выполняется успешно, свойство IsCompiled класса XmlSchemaSet имеет значение true
.
Примечание.
Свойство IsCompiled не изменяется, если изменяются схемы в классе XmlSchemaSet. Обновления отдельных схем в классе XmlSchemaSet не отслеживаются. В результате свойство IsCompiled может иметь значение true
, даже если одна из схем в классе XmlSchemaSet была изменена, но схемы не добавлялись и не удалялись из класса XmlSchemaSet.
В следующем примере файл books.xsd
добавляется в класс XmlSchemaSet, а затем вызывается метод Compile.
Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()
schemaSet.Add("http://www.contoso.com/books", "books.xsd")
schemaSet.Compile()
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add("http://www.contoso.com/books", "books.xsd");
schemaSet.Compile();
Дополнительные сведения о компиляции схем в объекте XmlSchemaSet см. в справочной документации по методу Compile.
Повторная обработка схем
При повторной обработке схемы в классе XmlSchemaSet выполняются все шаги предварительной обработки, выполняемые при вызове метода Add класса XmlSchemaSet. Если метод Reprocess выполнен успешно, свойство IsCompiled класса XmlSchemaSet имеет значение false
.
Метод Reprocess должен использоваться, когда схема в классе XmlSchemaSet была изменена после выполнения компиляции классом XmlSchemaSet.
В следующем примере показана повторная обработка схемы, добавленной в класс XmlSchemaSet с использованием метода Reprocess. После того, как класс XmlSchemaSet скомпилирован с использованием метода Compile, и схема, добавленная в XmlSchemaSet, изменена, свойство IsCompiled имеет значение true
, даже если схема в классе XmlSchemaSet была изменена. При вызове метода Reprocess выполняется вся предварительная обработка с использованием метода Add, и свойство IsCompiled устанавливается в значение false
.
Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()
Dim schema As XmlSchema = schemaSet.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd")
schemaSet.Compile()
Dim element As XmlSchemaElement = New XmlSchemaElement()
schema.Items.Add(element)
element.Name = "book"
element.SchemaTypeName = New XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema")
schemaSet.Reprocess(schema)
XmlSchemaSet schemaSet = new XmlSchemaSet();
XmlSchema schema = schemaSet.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd");
schemaSet.Compile();
XmlSchemaElement element = new XmlSchemaElement();
schema.Items.Add(element);
element.Name = "book";
element.SchemaTypeName = new XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema");
schemaSet.Reprocess(schema);
Дополнительные сведения о повторной обработке схем в классе XmlSchemaSet см. в справочной документации по методу Reprocess.
Проверка наличия схемы
Метод Contains класса XmlSchemaSet можно использовать для проверки, что схема содержится в классе XmlSchemaSet. Метод Contains принимает целевое пространство имен или объект XmlSchema для проверки. Метод Contains возвращает значение true
если схема содержится в классе XmlSchemaSet; в противном случае возвращается значение false
.
Дополнительные сведения о проверке наличия схемы см. в справочной документации по методу Contains.
Удаление схем
Схемы удаляются из класса XmlSchemaSet с помощью методов Remove и RemoveRecursive класса XmlSchemaSet. Метод Remove удаляет указанную схему из класса XmlSchemaSet, а метод RemoveRecursive удаляет из класса XmlSchemaSet указанную схему и все схемы, импортированные ей.
В следующем примере продемонстрировано добавление нескольких схем в класс XmlSchemaSet с последующим использованием метода RemoveRecursive для удаления одной из схем и всех импортированных ей схем.
Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()
schemaSet.Add("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd")
schemaSet.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd")
schemaSet.Add("http://www.contoso.com/music", "http://www.contoso.com/music.xsd")
Dim schema As XmlSchema
For Each schema In schemaSet.Schemas()
If schema.TargetNamespace = "http://www.contoso.com/music" Then
schemaSet.RemoveRecursive(schema)
End If
Next
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd");
schemaSet.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd");
schemaSet.Add("http://www.contoso.com/music", "http://www.contoso.com/music.xsd");
foreach (XmlSchema schema in schemaSet.Schemas())
{
if (schema.TargetNamespace == "http://www.contoso.com/music")
{
schemaSet.RemoveRecursive(schema);
}
}
Дополнительные сведения об удалении схем из класса XmlSchemaSet см. в справочной документации по методам Remove и RemoveRecursive.
Разрешение схем и xs:import
В следующих примерах описано поведение класса XmlSchemaSet при импорте схем и существовании в классе XmlSchemaSet нескольких схем для данного пространства имен.
Например, рассмотрим класс XmlSchemaSet, содержащий несколько схем пространства имен http://www.contoso.com
. Схема со следующей директивой xs:import
добавлена в класс XmlSchemaSet.
<xs:import namespace="http://www.contoso.com" schemaLocation="http://www.contoso.com/schema.xsd" />
Класс XmlSchemaSet пытается импортировать схему пространства имен http://www.contoso.com
, загрузив ее по URL-адресу http://www.contoso.com/schema.xsd
. В импортируемой схеме доступны только декларация схемы и типы, объявленные в документе схемы, даже если другие документы схемы из пространства имен http://www.contoso.com
существуют в классе XmlSchemaSet. Если файл schema.xsd
не может быть обнаружен по URL-адресу http://www.contoso.com/schema.xsd
, схема для пространства имен http://www.contoso.com
не импортируется в импортируемую схему.
Проверка XML-документов
XML-документы могут быть проверены путем сопоставления со схемами в классе XmlSchemaSet. Для проверки XML-документа нужно добавить схему в свойство XmlSchemaSetSchemas объекта XmlReaderSettings, или добавить класс XmlSchemaSet к свойству Schemas объекта XmlReaderSettings. Затем объект XmlReaderSettings используется методом Create класса XmlReader, чтобы создать объект XmlReader и проверить XML-документ.
Дополнительные сведения о проверке XML-документов с использованием класса XmlSchemaSet см. в руководстве по проверке схем XML (XSD) с помощью XmlSchemaSet.