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