Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Observação
Este artigo fornece observações complementares à documentação de referência para esta API.
Importante
- Não use esquemas de fontes ou locais desconhecidos ou não confiáveis. Isso comprometerá a segurança do seu código.
- Os esquemas XML (incluindo esquemas embutidos) são inerentemente vulneráveis a ataques de negação de serviço; Não os aceite em cenários não confiáveis.
- Mensagens de erro e exceções de validação de esquema podem expor informações confidenciais sobre o modelo de conteúdo ou caminhos de URI para o arquivo de esquema. Tenha cuidado para não expor essas informações a chamadores não confiáveis.
- Considerações adicionais de segurança são abordadas na seção "Considerações de segurança".
XmlSchemaSet é um cache ou biblioteca onde você pode armazenar esquemas XSD (XML Schema Definition Language). XmlSchemaSet melhora o desempenho armazenando esquemas em cache na memória em vez de acessá-los a partir de um arquivo ou URL. Cada esquema é identificado pelo URI do namespace e pelo local especificado quando o esquema foi adicionado ao conjunto. Use a XmlReaderSettings.Schemas propriedade para atribuir o XmlSchemaSet objeto que um leitor XML deve usar para validação de dados.
Considerações de segurança
Não use esquemas de fontes desconhecidas ou não confiáveis. Isso comprometerá a segurança do seu código. Os namespaces externos ou locais referenciados em incluir, importar e redefinir elementos de um esquema são resolvidos em relação ao URI base do esquema que os inclui ou importa. Por exemplo, se o URI base do esquema de inclusão ou importação estiver vazio ou
null, os locais externos serão resolvidos em relação ao diretório atual. A XmlUrlResolver classe é usada para resolver esquemas externos por padrão. Para desabilitar a resolução de elementos de inclusão, importação e redefinição de um esquema, defina a XmlSchemaSet.XmlResolver propriedade comonull.A XmlSchemaSet classe usa a System.Text.RegularExpressions.Regex classe para analisar e corresponder expressões regulares em um esquema XML. A validação de facetas de padrão com expressões regulares em um esquema XML pode envolver maior uso da CPU e deve ser evitada em cenários de alta disponibilidade.
As exceções geradas como resultado do uso da XmlSchemaSet classe, como a XmlSchemaException classe, podem conter informações confidenciais que não devem ser expostas em cenários não confiáveis. Por exemplo, a propriedade SourceUri de XmlSchemaException retorna o caminho URI para o arquivo de esquema que causou a exceção. A propriedade SourceUri não deve ser exposta em cenários não confiáveis. As exceções devem ser tratadas adequadamente para que essas informações confidenciais não sejam expostas em cenários não confiáveis.
Exemplos
O exemplo a seguir valida um ficheiro XML usando esquemas armazenados no XmlSchemaSet. O namespace no arquivo XML, urn:bookstore-schema, identifica qual esquema no XmlSchemaSet a ser usado para validação. A saída do exemplo mostra que o arquivo XML tem duas violações de esquema:
O primeiro
<book>elemento contém um<author>elemento mas nenhum<title>elemento ou<price>elemento.No elemento
<author>do último elemento<book>, falta um elemento<first-name>e<last-name>e tem um elemento<name>inválido em vez disso.
using System;
using System.Xml;
using System.Xml.Schema;
using System.IO;
public class Sample
{
public static void Main() {
// Create the XmlSchemaSet class.
XmlSchemaSet sc = new XmlSchemaSet();
// Add the schema to the collection.
sc.Add("urn:bookstore-schema", "books.xsd");
// Set the validation settings.
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.Schemas = sc;
settings.ValidationEventHandler += ValidationCallBack;
// Create the XmlReader object.
XmlReader reader = XmlReader.Create("booksSchemaFail.xml", settings);
// Parse the file.
while (reader.Read());
}
// Display any validation errors.
private static void ValidationCallBack(object sender, ValidationEventArgs e) {
Console.WriteLine($"Validation Error:\n {e.Message}\n");
}
}
// The example displays output like the following:
// Validation Error:
// The element 'book' in namespace 'urn:bookstore-schema' has invalid child element 'author'
// in namespace 'urn:bookstore-schema'. List of possible elements expected: 'title' in
// namespace 'urn:bookstore-schema'.
//
// Validation Error:
// The element 'author' in namespace 'urn:bookstore-schema' has invalid child element 'name'
// in namespace 'urn:bookstore-schema'. List of possible elements expected: 'first-name' in
// namespace 'urn:bookstore-schema'.
Imports System.Xml
Imports System.Xml.Schema
Imports System.IO
Public Module Sample
Public Sub Main()
' Create the XmlSchemaSet class.
Dim sc as XmlSchemaSet = new XmlSchemaSet()
' Add the schema to the collection.
sc.Add("urn:bookstore-schema", "books.xsd")
' Set the validation settings.
Dim settings as XmlReaderSettings = new XmlReaderSettings()
settings.ValidationType = ValidationType.Schema
settings.Schemas = sc
AddHandler settings.ValidationEventHandler, AddressOf ValidationCallBack
' Create the XmlReader object.
Dim reader as XmlReader = XmlReader.Create("booksSchemaFail.xml", settings)
' Parse the file.
While reader.Read()
End While
End Sub
' Display any validation errors.
Private Sub ValidationCallBack(sender as object, e as ValidationEventArgs)
Console.WriteLine($"Validation Error:{vbCrLf} {e.Message}")
Console.WriteLine()
End Sub
End Module
' The example displays output like the following:
' Validation Error:
' The element 'book' in namespace 'urn:bookstore-schema' has invalid child element 'author'
' in namespace 'urn:bookstore-schema'. List of possible elements expected: 'title' in
' namespace 'urn:bookstore-schema'.
'
' Validation Error:
' The element 'author' in namespace 'urn:bookstore-schema' has invalid child element 'name'
' in namespace 'urn:bookstore-schema'. List of possible elements expected: 'first-name' in
' namespace 'urn:bookstore-schema'.
Entrada
O exemplo usa os dois arquivos de entrada a seguir.
booksSchemaFail.xml:
<?xml version='1.0'?>
<bookstore xmlns="urn:bookstore-schema">
<book>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
</book>
<book genre="novel">
<title>The Confidence Man</title>
<author>
<first-name>Herman</first-name>
<last-name>Melville</last-name>
</author>
<price>11.99</price>
</book>
<book genre="philosophy">
<title>The Gorgias</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
</bookstore>
livros.xsd:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="urn:bookstore-schema"
elementFormDefault="qualified"
targetNamespace="urn:bookstore-schema">
<xsd:element name="bookstore" type="bookstoreType"/>
<xsd:complexType name="bookstoreType">
<xsd:sequence maxOccurs="unbounded">
<xsd:element name="book" type="bookType"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="bookType">
<xsd:sequence>
<xsd:element name="title" type="xsd:string"/>
<xsd:element name="author" type="authorName"/>
<xsd:element name="price" type="xsd:decimal"/>
</xsd:sequence>
<xsd:attribute name="genre" type="xsd:string"/>
</xsd:complexType>
<xsd:complexType name="authorName">
<xsd:sequence>
<xsd:element name="first-name" type="xsd:string"/>
<xsd:element name="last-name" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>