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.
Ao contrário do Add método da XmlSchemaCollection classe, os esquemas não são compilados ao chamar o Add método do XmlSchemaSet. O Compile método do é explicitamente chamado no código de XmlSchemaSet exemplo.
Para iterar sobre um XmlSchemaSet, você deve usar a Schemas propriedade do XmlSchemaSet.
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.