Поделиться через


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.

См. также