Compartilhar via


XmlSchemaSet para compilação de esquema

Descreve o XmlSchemaSetcache em que esquemas XSD (linguagem de definição de esquema XML) podem ser armazenados e validados.

A classe de XmlSchemaSet

XmlSchemaSet é um cache em que esquemas de linguagem de definição de esquema XML (XSD) 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 versão 2.0, as classes System.Xml e XmlValidatingReader são obsoletas e foram substituídas pelos métodos XmlSchemaCollection e pela classe Create, respectivamente.

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

Veja a seguir uma comparação entre a XmlSchemaCollection classe e a XmlSchemaSet classe.

XmlSchemaCollection XmlSchemaSet
Dá suporte aos esquemas XDR e W3C XML da Microsoft. Só dá suporte a 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 apenas dentro desse esquema. Os esquemas compilados geram um único esquema lógico, um "conjunto" de esquemas. Todos os esquemas importados em 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.
Somente 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 principais diferenças entre as duas classes.

Veja a seguir 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);  
}  

Veja a seguir 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 XmlSchemaSet usando o método Add de 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, usará o XmlSchemaSet namespace de destino definido no esquema.

Os esquemas são recuperados de XmlSchemaSet usando a propriedade de Schemas de XmlSchemaSet. A propriedade Schemas do XmlSchemaSet permite iterar sobre os objetos XmlSchema contidos no XmlSchemaSet. A propriedade Schemas retorna todos os objetos XmlSchema contidos no XmlSchemaSet, ou, quando é fornecido um parâmetro de namespace de destino, retorna todos os objetos XmlSchema 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 books.xsd no namespace http://www.contoso.com/books a um XmlSchemaSet, recupera todos os esquemas que pertencem ao namespace http://www.contoso.com/books do XmlSchemaSet, e grava esses esquemas no 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);  
}  

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

Compilando esquemas

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

Observação

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

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

Observação

A propriedade IsCompiled não é 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 foi alterado, desde que nenhum esquema tenha sido adicionado ou removido do XmlSchemaSet.

O exemplo a seguir adiciona o books.xsd arquivo ao XmlSchemaSet método e, em 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 a compilação de esquemas em um XmlSchemaSet, consulte a documentação de referência do Compile método.

Reprocessamento esquemas

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

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

O exemplo a seguir ilustra o reprocessamento de um esquema adicionado ao XmlSchemaSet usando o método Reprocess. Depois que o XmlSchemaSet é compilado usando o método Compile, e o esquema adicionado ao XmlSchemaSet é modificado, a propriedade IsCompiled é 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 se há um esquema

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

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

Removendo os esquemas

Esquemas são removidos de um XmlSchemaSet usando os métodos Remove 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 importados do XmlSchemaSet.

O exemplo a seguir ilustra a adição de vários esquemas a um XmlSchemaSet, usando o RemoveRecursive método para remover um dos esquemas e todos os esquemas importados por ele.

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 dos métodos Remove e RemoveRecursive.

Resolução e xs:importde esquema

Os exemplos a seguir descrevem o XmlSchemaSet comportamento de importação de esquemas quando existem vários esquemas para um determinado namespace 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 diretiva xs:import é adicionado ao XmlSchemaSet.

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

As XmlSchemaSet tenta importar um esquema para o namespace http://www.contoso.com ao carregá-lo do URL http://www.contoso.com/schema.xsd. Somente a declaração de esquema e os tipos declarados no documento de esquema estão disponíveis no esquema de importação, embora haja 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

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

Para obter mais informações sobre a validação de documentos XML usando um XmlSchemaSet, veja Validação de Schema XML (XSD) com XmlSchemaSet.

Consulte também