XmlSchemaSet para compilação de esquema

Descreve XmlSchemaSet, um cache onde os esquemas de linguagem de definição de esquema XML (XSD) podem ser armazenados e validado.

A classe de XmlSchemaSet

XmlSchemaSet é um cache onde os esquemas de linguagem de definição de esquema XML (XSD) podem ser armazenados e validado.

Na versão 1,0 de System.Xml , os esquemas XML foram carregados em uma classe de XmlSchemaCollection como uma biblioteca de esquemas. Na versão 2,0 de System.Xml , XmlValidatingReader e as classes de XmlSchemaCollection são obsoletos, e foram substituídas por métodos de Create , e a classe de XmlSchemaSet respectivamente.

XmlSchemaSet foi introduzido para corrigir um número de problemas que incluem a compatibilidade de padrão, o desempenho, e o formato reduzido do esquema do Microsoft com dados (XDR) obsoletos.

A seguir está uma comparação entre a classe de XmlSchemaCollection e a classe de XmlSchemaSet .

XmlSchemaCollection XmlSchemaSet
Esquemas XML de XDR e o W3C da Microsoft de suporte. Somente esquemas XML W3C de suporte.
Os esquemas são compilados quando o método de Add é chamado. Os esquemas não são compilados quando o método de Add é chamado. Isso fornece uma melhoria de desempenho durante a criação de biblioteca de esquema.
Cada esquema gera uma versão compilada individual que pode resultar em "ilhas de esquema". Como resultado, todos os inclusões e importações são definidos apenas dentro desse esquema. Os esquemas compilados gerenciar um único esquema lógico, “set” de esquemas. Todos os esquemas importados em um esquema que são adicionados ao dataset são adicionados diretamente ao conjunto próprios. 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 a mesma namespace de destino podem ser adicionados como não há nenhum conflito de tipo.

Migrar para o XmlSchemaSet

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

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

O exemplo a seguir é o equivalente de código de 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 XmlSchemaSet, está associado com o URI de um namespace de destino. O URI de namespace de destino ou pode ser especificado como um parâmetro para o método de Add ou se nenhuma namespace de destino for especificada, XmlSchemaSet usa o namespace de destino definida no esquema.

Os esquemas são recuperados de XmlSchemaSet usando a propriedade de Schemas de XmlSchemaSet. A propriedade de Schemas de XmlSchemaSet permite que você faz iterações sobre os objetos de XmlSchema contidos em XmlSchemaSet. A propriedade de Schemas retorna todos os objetos de XmlSchema contidos em XmlSchemaSet, ou, dado um parâmetro de namespace de destino, retorna todos os objetos de XmlSchema que pertencem ao namespace de destino. Se null é especificado como o parâmetro de namespace de destino, a propriedade de Schemas retorna todos os esquemas sem um namespace.

O exemplo a seguir adiciona o esquema de books.xsd no espaço de http://www.contoso.com/books a XmlSchemaSet, recupera todos os esquemas que pertencem ao namespace de http://www.contoso.com/books de XmlSchemaSet, e grava os esquemas a 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 XmlSchemaSet objeto, consulte o método de Add e documentação de referência da propriedade de Schemas .

Esquemas de compilação

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

Observação

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

Se o método de Compile executa com êxito, a propriedade de IsCompiled de XmlSchemaSet é definida como true.

Observação

A propriedade de IsCompiled não é afetado se os esquemas são editados quando em XmlSchemaSet. As atualizações de esquemas individuais em XmlSchemaSet não são controladas. Como resultado, a propriedade de IsCompiled pode ser true mesmo que um dos esquemas contidos em XmlSchemaSet é modificado, como nenhum esquema foi adicionado ou removido de XmlSchemaSet.

O exemplo a seguir adiciona o arquivo de books.xsd a XmlSchemaSet e chama o método de 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();  

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

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 ao método de Reprocess for bem-sucedida, a propriedade de IsCompiled de XmlSchemaSet é definida como false.

O método de Reprocess deve ser usado quando um esquema em XmlSchemaSet foi alterado depois que XmlSchemaSet executar a compilação.

O exemplo a seguir ilustra o reprocessamento um esquema adicionado a XmlSchemaSet usando o método Reprocess . Após XmlSchemaSet é compilado usando o método de Compile , e o esquema adicionado a XmlSchemaSet é alterado, a propriedade de IsCompiled é definida como true mesmo que um esquema em XmlSchemaSet é alterado. Chamando o método Reprocess executa todo o pré-processamento executado pelo método de Add , e defina a propriedade de IsCompiled a 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 reprocessamento de um esquema em XmlSchemaSet, consulte a documentação de referência de método Reprocess .

Verificar se um esquema

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

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

Removendo os esquemas

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

O exemplo a seguir ilustra adicionar vários esquemas a XmlSchemaSet, então o uso do método de RemoveRecursive para remover um de esquemas e todos os esquemas que 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 a remoção de esquemas de XmlSchemaSet, consulte a documentação de referência dos métodos de Remove e de RemoveRecursive .

Resolução e xs:importde esquema

Os exemplos a seguir descrevem comportamento de XmlSchemaSet para importar esquemas quando vários esquemas para uma determinada namespace existem em XmlSchemaSet.

Por exemplo, considere XmlSchemaSet que contém vários esquemas para o espaço de http://www.contoso.com . Um esquema com a seguinte diretiva de xs:import é adicionado a XmlSchemaSet.

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

XmlSchemaSet tenta importar um esquema para o espaço de http://www.contoso.com carregar a URL de http://www.contoso.com/schema.xsd . Somente a declaração e os tipos esquema declarados no documento de esquema estão disponíveis no esquema importando, mesmo que haja outros documentos de esquema para o espaço de http://www.contoso.com em XmlSchemaSet. Se o arquivo de schema.xsd não pode ser localizado no URL de http://www.contoso.com/schema.xsd , nenhum esquema para o espaço de http://www.contoso.com é importado no esquema importando.

Validando documentos XML

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

Para saber mais sobre como validar documentos XML usando um XmlSchemaSet, confira Validação de XSD (esquema XML) com XmlSchemaSet.

Confira também