Partilhar via


XmlSchemaSet para compilação de esquema

Descreve o , um cache onde esquemas XmlSchemaSetXSD (XML Schema Definition Language) podem ser armazenados e validados.

O XmlSchemaSet Classe

O XmlSchemaSet é um cache onde os esquemas XSD (XML Schema Definition Language) podem ser armazenados e validados.

Na System.Xml versão 1.0, os esquemas XML foram carregados em uma XmlSchemaCollection classe como uma biblioteca de esquemas. Na System.Xml versão 2.0, as XmlValidatingReader classes e são XmlSchemaCollection obsoletas e foram substituídas Create pelos métodos e pela XmlSchemaSet classe, respectivamente.

O XmlSchemaSet foi introduzido para corrigir uma série de problemas, incluindo compatibilidade de padrões, desempenho e o obsoleto formato de esquema Microsoft XML-Data Reduced (XDR).

Segue-se uma comparação entre a XmlSchemaCollection classe e a XmlSchemaSet classe.

XmlSchemaCollection XmlSchemaSet
Suporta esquemas XML Microsoft XDR e W3C. Suporta apenas esquemas XML W3C.
Os esquemas são compilados quando o Add método é chamado. Os esquemas não são compilados quando o Add método é chamado. Isso fornece uma melhoria de desempenho durante a criação da biblioteca de esquemas.
Cada esquema gera uma versão compilada individual que pode resultar em "ilhas de esquema". Como resultado, todas as inclusões e importações têm escopo somente dentro desse esquema. Os esquemas compilados geram um único esquema lógico, um "conjunto" de esquemas. Todos os esquemas importados dentro de um esquema que são adicionados ao conjunto são adicionados diretamente ao próprio conjunto. Isso significa que todos os tipos estão disponíveis para todos os esquemas.
Apenas um esquema para um namespace de destino específico pode existir na coleção. Vários esquemas para o mesmo namespace de destino podem ser adicionados, desde que não haja conflitos de tipo.

Migrando para o XmlSchemaSet

O exemplo de código a seguir fornece um guia para migrar para a nova XmlSchemaSet classe da classe obsoleta XmlSchemaCollection . O exemplo de código ilustra as seguintes diferenças principais entre as duas classes.

A seguir está o exemplo de código obsoleto 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);  
}  

A seguir está o exemplo de código equivalente 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);  
}  

Adicionando e recuperando esquemas

Os esquemas são adicionados a um XmlSchemaSet usando o Add método do XmlSchemaSet. Quando um esquema é adicionado a um XmlSchemaSet, ele é associado a um URI de namespace de destino. O URI do namespace de destino pode ser especificado como um parâmetro para o Add método ou, se nenhum namespace de destino for especificado, o XmlSchemaSet usará o namespace de destino definido no esquema.

Os esquemas são recuperados de um XmlSchemaSet usando a Schemas propriedade do XmlSchemaSet. A Schemas propriedade do XmlSchemaSet permite iterar sobre os XmlSchema objetos contidos no XmlSchemaSet. A Schemas propriedade retorna todos os XmlSchema objetos contidos no XmlSchemaSet, ou, dado um parâmetro de namespace de destino, retorna todos os XmlSchema objetos que pertencem ao namespace de destino. Se null for especificado como o parâmetro de namespace de destino, a Schemas propriedade retornará todos os esquemas sem um namespace.

O exemplo a seguir adiciona o esquema no http://www.contoso.com/books namespace a um XmlSchemaSet, recupera todos os esquemas que pertencem ao http://www.contoso.com/books namespace do XmlSchemaSete, em seguida, grava esses esquemas no Console.books.xsd

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);  
}  

Para obter mais informações sobre como adicionar e recuperar esquemas de um XmlSchemaSet objeto, consulte o Add método e a Schemas documentação de referência de propriedade.

Compilando esquemas

Os esquemas em um XmlSchemaSet são compilados em um esquema lógico pelo Compile método do XmlSchemaSet.

Nota

Ao contrário da classe obsoleta XmlSchemaCollection , os esquemas não são compilados quando o Add método é chamado.

Se o Compile método for executado com êxito, a IsCompiled propriedade do XmlSchemaSet é definida como true.

Nota

A IsCompiled propriedade não será afetada se os esquemas forem editados enquanto estiverem no XmlSchemaSet. As atualizações dos esquemas individuais no XmlSchemaSet não são rastreadas. Como resultado, a IsCompiled propriedade pode ser true mesmo que um dos esquemas contidos no XmlSchemaSet tenha sido alterado, desde que nenhum esquema tenha sido adicionado ou removido do XmlSchemaSet.

O exemplo a seguir adiciona o books.xsd arquivo ao e, em XmlSchemaSet seguida, chama o Compile método.

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();  

Para obter mais informações sobre como compilar esquemas em um XmlSchemaSet, consulte a documentação de referência do Compile método.

Reprocessamento de esquemas

O reprocessamento de um esquema em um XmlSchemaSet executa todas as etapas de pré-processamento executadas em um esquema quando o Add método do XmlSchemaSet é chamado. Se a chamada para o Reprocess método for bem-sucedida, a IsCompiled propriedade do XmlSchemaSet é definida como false.

O Reprocess método deve ser usado quando um esquema no XmlSchemaSet foi modificado após a XmlSchemaSet compilação executada.

O exemplo a seguir ilustra o XmlSchemaSet reprocessamento de um esquema adicionado ao usando o Reprocess método. Depois que o XmlSchemaSet é compilado usando o Compile método e o esquema adicionado ao XmlSchemaSet é modificado, a IsCompiled propriedade é definida como true mesmo que um esquema no XmlSchemaSet tenha sido modificado. Chamar o Reprocess método executa todo o pré-processamento executado pelo Add método e define a IsCompiled propriedade como 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);  

Para obter mais informações sobre como reprocessar um esquema em um XmlSchemaSet, consulte a documentação de referência do Reprocess método.

Verificando um esquema

Você pode usar o Contains método do XmlSchemaSet para verificar se um esquema está contido em um XmlSchemaSetarquivo . O Contains método usa um namespace de destino ou um XmlSchema objeto para verificar. Em ambos os casos, o Contains método retorna true se o esquema estiver contido no XmlSchemaSet; caso contrário, ele retorna false.

Para obter mais informações sobre como verificar um esquema, consulte a documentação de referência do Contains método.

Removendo esquemas

Os esquemas são removidos de um XmlSchemaSet usando os Remove métodos e RemoveRecursive do XmlSchemaSet. O Remove método remove o esquema especificado do XmlSchemaSet, enquanto o RemoveRecursive método remove o esquema especificado e todos os esquemas que ele importa do XmlSchemaSet.

O exemplo a seguir ilustra a adição de vários esquemas a um XmlSchemaSete, em seguida, o uso do RemoveRecursive método para remover um dos esquemas e todos os esquemas que ele importa.

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);  
   }  
}  

Para obter mais informações sobre como remover esquemas de um XmlSchemaSet, consulte a documentação de referência de Remove métodos e RemoveRecursive .

Resolução de esquema e xs:import

Os exemplos a seguir descrevem o XmlSchemaSet comportamento para importar esquemas quando vários esquemas para um determinado namespace existem em um XmlSchemaSet.

Por exemplo, considere um XmlSchemaSet que contenha vários esquemas para o http://www.contoso.com namespace. Um esquema com a seguinte xs:import diretiva é adicionado ao XmlSchemaSet.

<xs:import namespace="http://www.contoso.com" schemaLocation="http://www.contoso.com/schema.xsd" />  

As XmlSchemaSet tentativas de importar um esquema para o namespace carregando-o http://www.contoso.com da http://www.contoso.com/schema.xsd URL. Somente a declaração de esquema e os tipos declarados no documento de esquema estão disponíveis no esquema de importação, mesmo que existam outros documentos de esquema para o http://www.contoso.com namespace no XmlSchemaSet. Se o schema.xsd arquivo não puder ser localizado na http://www.contoso.com/schema.xsd URL, nenhum esquema para o http://www.contoso.com namespace será importado para o esquema de importação.

Validando documentos XML

Os documentos XML podem ser validados em relação a esquemas em um XmlSchemaSetarquivo . Você valida XmlSchemaSetSchemas um documento XML adicionando um esquema à propriedade de um XmlReaderSettings objeto ou adicionando um XmlSchemaSet à Schemas propriedade de um XmlReaderSettings objeto. O XmlReaderSettings objeto é então usado pelo Create método da XmlReader classe para criar um XmlReader objeto e validar o documento XML.

Para obter mais informações sobre como validar documentos XML usando um XmlSchemaSet, consulte Validação de esquema XML (XSD) com XmlSchemaSet.

Consulte também