Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
AXmlDocument classe não valida o XML no DOM (Document Object Model) em relação a um esquema XSD (XML Schema Definition Language) ou DTD (Document Type Definition) por padrão, o XML só é verificado se está bem formado.
Para validar o XML no DOM, pode-se validar o XML enquanto é carregado no DOM, passando uma validação de esquema para o método XmlReader da classe Load, ou validar um documento XML anteriormente não validado no DOM usando o método XmlDocument da classe Validate.
Validando um documento XML como ele é carregado no DOM
A XmlDocument classe valida os dados XML à medida que são carregados no DOM quando uma validação XmlReader é passada para o Load método da XmlDocument classe.
Após a validação bem-sucedida, os padrões de esquema são aplicados, os valores de texto são convertidos em valores atômicos conforme necessário e as informações de tipo são associadas a itens de informação validados. Como resultado, os dados XML digitados substituem os dados XML não tipados anteriormente.
Criando um XML Schema-Validating XmlReader
Para criar um XmlReader que valida esquemas XML, siga estas etapas.
Construa uma nova XmlReaderSettings instância.
Adicione um esquema XML à Schemas propriedade da XmlReaderSettings instância.
Especifique
Schemacomo o ValidationType.Opcionalmente, especifique ValidationFlags e a ValidationEventHandler para lidar com erros de validação de esquema e avisos encontrados durante a validação.
Finalmente, passe o objeto XmlReaderSettings para o método Create da classe XmlReader, juntamente com o documento XML, criando um XmlReader que valida o esquema.
Exemplo
No exemplo de código a seguir, um validador de esquema XmlReader valida os dados XML que são carregados no DOM. Modificações inválidas são feitas no documento XML e, em seguida, o documento é revalidado, causando erros de validação de esquema. Finalmente, um dos erros é corrigido e, em seguida, parte do documento XML é parcialmente validado.
using System;
using System.Xml;
using System.Xml.Schema;
class XmlDocumentValidationExample
{
static void Main(string[] args)
{
try
{
// Create a schema validating XmlReader.
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd");
settings.ValidationEventHandler += new ValidationEventHandler(ValidationEventHandler);
settings.ValidationFlags = settings.ValidationFlags | XmlSchemaValidationFlags.ReportValidationWarnings;
settings.ValidationType = ValidationType.Schema;
XmlReader reader = XmlReader.Create("contosoBooks.xml", settings);
// The XmlDocument validates the XML document contained
// in the XmlReader as it is loaded into the DOM.
XmlDocument document = new XmlDocument();
document.Load(reader);
// Make an invalid change to the first and last
// price elements in the XML document, and write
// the XmlSchemaInfo values assigned to the price
// element during load validation to the console.
XmlNamespaceManager manager = new XmlNamespaceManager(document.NameTable);
manager.AddNamespace("bk", "http://www.contoso.com/books");
XmlNode priceNode = document.SelectSingleNode(@"/bk:bookstore/bk:book/bk:price", manager);
Console.WriteLine($"SchemaInfo.IsDefault: {priceNode.SchemaInfo.IsDefault}");
Console.WriteLine($"SchemaInfo.IsNil: {priceNode.SchemaInfo.IsNil}");
Console.WriteLine($"SchemaInfo.SchemaElement: {priceNode.SchemaInfo.SchemaElement}");
Console.WriteLine($"SchemaInfo.SchemaType: {priceNode.SchemaInfo.SchemaType}");
Console.WriteLine($"SchemaInfo.Validity: {priceNode.SchemaInfo.Validity}");
priceNode.InnerXml = "A";
XmlNodeList priceNodes = document.SelectNodes(@"/bk:bookstore/bk:book/bk:price", manager);
XmlNode lastprice = priceNodes[priceNodes.Count - 1];
lastprice.InnerXml = "B";
// Validate the XML document with the invalid changes.
// The invalid changes cause schema validation errors.
document.Validate(ValidationEventHandler);
// Correct the invalid change to the first price element.
priceNode.InnerXml = "8.99";
// Validate only the first book element. The last book
// element is invalid, but not included in validation.
XmlNode bookNode = document.SelectSingleNode(@"/bk:bookstore/bk:book", manager);
document.Validate(ValidationEventHandler, bookNode);
}
catch (XmlException ex)
{
Console.WriteLine($"XmlDocumentValidationExample.XmlException: {ex.Message}");
}
catch(XmlSchemaValidationException ex)
{
Console.WriteLine($"XmlDocumentValidationExample.XmlSchemaValidationException: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"XmlDocumentValidationExample.Exception: {ex.Message}");
}
}
static void ValidationEventHandler(object sender, System.Xml.Schema.ValidationEventArgs args)
{
if (args.Severity == XmlSeverityType.Warning)
Console.Write("\nWARNING: ");
else if (args.Severity == XmlSeverityType.Error)
Console.Write("\nERROR: ");
Console.WriteLine(args.Message);
}
}
Imports System.Xml
Imports System.Xml.Schema
Class XmlDocumentValidationExample
Shared Sub Main()
Try
' Create a schema validating XmlReader.
Dim settings As XmlReaderSettings = New XmlReaderSettings()
settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd")
AddHandler settings.ValidationEventHandler, New ValidationEventHandler(AddressOf ValidationEventHandler)
settings.ValidationFlags = settings.ValidationFlags And XmlSchemaValidationFlags.ReportValidationWarnings
settings.ValidationType = ValidationType.Schema
Dim reader As XmlReader = XmlReader.Create("contosoBooks.xml", settings)
' The XmlDocument validates the XML document contained
' in the XmlReader as it is loaded into the DOM.
Dim document As XmlDocument = New XmlDocument()
document.Load(reader)
' Make an invalid change to the first and last
' price elements in the XML document, and write
' the XmlSchemaInfo values assigned to the price
' element during load validation to the console.
Dim manager As XmlNamespaceManager = New XmlNamespaceManager(document.NameTable)
manager.AddNamespace("bk", "http://www.contoso.com/books")
Dim priceNode As XmlNode = document.SelectSingleNode("/bk:bookstore/bk:book/bk:price", manager)
Console.WriteLine("SchemaInfo.IsDefault: {0}", priceNode.SchemaInfo.IsDefault)
Console.WriteLine("SchemaInfo.IsNil: {0}", priceNode.SchemaInfo.IsNil)
Console.WriteLine("SchemaInfo.SchemaElement: {0}", priceNode.SchemaInfo.SchemaElement)
Console.WriteLine("SchemaInfo.SchemaType: {0}", priceNode.SchemaInfo.SchemaType)
Console.WriteLine("SchemaInfo.Validity: {0}", priceNode.SchemaInfo.Validity)
priceNode.InnerXml = "A"
Dim priceNodes As XmlNodeList = document.SelectNodes("/bk:bookstore/bk:book/bk:price", manager)
Dim lastprice As XmlNode = priceNodes(priceNodes.Count - 1)
lastprice.InnerXml = "B"
' Validate the XML document with the invalid changes.
' The invalid changes cause schema validation errors.
document.Validate(AddressOf ValidationEventHandler)
' Correct the invalid change to the first price element.
priceNode.InnerXml = "8.99"
' Validate only the first book element. The last book
' element is invalid, but not included in validation.
Dim bookNode As XmlNode = document.SelectSingleNode("/bk:bookstore/bk:book", manager)
document.Validate(AddressOf ValidationEventHandler, bookNode)
Catch ex As XmlException
Console.WriteLine("XmlDocumentValidationExample.XmlException: {0}", ex.Message)
Catch ex As XmlSchemaValidationException
Console.WriteLine("XmlDocumentValidationExample.XmlSchemaValidationException: {0}", ex.Message)
Catch ex As Exception
Console.WriteLine("XmlDocumentValidationExample.Exception: {0}", ex.Message)
End Try
End Sub
Shared Sub ValidationEventHandler(ByVal sender As Object, ByVal args As ValidationEventArgs)
If args.Severity = XmlSeverityType.Warning Then
Console.Write(vbCrLf & "WARNING: ")
Else
If args.Severity = XmlSeverityType.Error Then
Console.Write(vbCrLf & "ERROR: ")
End If
End If
Console.WriteLine(args.Message)
End Sub
End Class
O exemplo usa o arquivo contosoBooks.xml como entrada.
<?xml version="1.0" encoding="utf-8" ?>
<bookstore xmlns="http://www.contoso.com/books">
<book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
<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" publicationdate="1991-02-15" ISBN="1-861001-57-6">
<title>The Gorgias</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
</bookstore>
O exemplo também usa o contosoBooks.xsd arquivo como entrada.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.contoso.com/books" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="bookstore">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="book">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string" />
<xs:element name="author">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="name" type="xs:string" />
<xs:element minOccurs="0" name="first-name" type="xs:string" />
<xs:element minOccurs="0" name="last-name" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="price" type="xs:decimal" />
</xs:sequence>
<xs:attribute name="genre" type="xs:string" use="required" />
<xs:attribute name="publicationdate" type="xs:date" use="required" />
<xs:attribute name="ISBN" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Considere o seguinte ao validar dados XML à medida que são carregados no DOM.
No exemplo acima, o ValidationEventHandler é chamado sempre que um tipo inválido é encontrado. Se a ValidationEventHandler não estiver definido na validação XmlReader, um XmlSchemaValidationException será lançado quando Load for chamado se qualquer atributo ou tipo de elemento não corresponder ao tipo correspondente especificado no esquema de validação.
Quando um documento XML é carregado em um XmlDocument objeto com um esquema associado que define valores padrão, o XmlDocument trata esses padrões como se aparecessem no documento XML. Isso significa que a IsEmptyElement propriedade sempre retorna
falsepara um elemento que foi predefinido no esquema. Mesmo que no documento XML, ele foi escrito como um elemento vazio.
Validando um documento XML no DOM
O método Validate da classe XmlDocument valida os dados XML carregados no DOM em relação aos esquemas na propriedade XmlDocument do objeto Schemas. Após a validação bem-sucedida, os padrões de esquema são aplicados, os valores de texto são convertidos em valores atômicos conforme necessário e as informações de tipo são associadas a itens de informação validados. Como resultado, os dados XML digitados substituem os dados XML não tipados anteriormente.
O exemplo abaixo é semelhante ao exemplo em "Validando um documento XML como ele é carregado no DOM" acima. Neste exemplo, o documento XML não é validado enquanto é carregado no DOM, mas sim depois de ter sido carregado no DOM, usando o método Validate da classe XmlDocument. O Validate método valida o documento XML em relação aos esquemas XML contidos na Schemas propriedade do XmlDocument. Modificações inválidas são feitas no documento XML e o documento é revalidado, causando erros de validação de esquema. Finalmente, um dos erros é corrigido e, em seguida, parte do documento XML é parcialmente validado.
using System;
using System.Xml;
using System.Xml.Schema;
class XmlDocumentValidationExample
{
static void Main(string[] args)
{
try
{
// Create a new XmlDocument instance and load
// the XML document into the DOM.
XmlDocument document = new XmlDocument();
document.Load("contosoBooks.xml");
// Add the XML schema for the XML document to the
// Schemas property of the XmlDocument.
document.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd");
// Validate the XML document loaded into the DOM.
document.Validate(ValidationEventHandler);
// Make an invalid change to the first and last
// price elements in the XML document, and write
// the XmlSchemaInfo values assigned to the price
// element during validation to the console.
XmlNamespaceManager manager = new XmlNamespaceManager(document.NameTable);
manager.AddNamespace("bk", "http://www.contoso.com/books");
XmlNode priceNode = document.SelectSingleNode(@"/bk:bookstore/bk:book/bk:price", manager);
Console.WriteLine($"SchemaInfo.IsDefault: {priceNode.SchemaInfo.IsDefault}");
Console.WriteLine($"SchemaInfo.IsNil: {priceNode.SchemaInfo.IsNil}");
Console.WriteLine($"SchemaInfo.SchemaElement: {priceNode.SchemaInfo.SchemaElement}");
Console.WriteLine($"SchemaInfo.SchemaType: {priceNode.SchemaInfo.SchemaType}");
Console.WriteLine($"SchemaInfo.Validity: {priceNode.SchemaInfo.Validity}");
priceNode.InnerXml = "A";
XmlNodeList priceNodes = document.SelectNodes(@"/bk:bookstore/bk:book/bk:price", manager);
XmlNode lastprice = priceNodes[priceNodes.Count - 1];
lastprice.InnerXml = "B";
// Validate the XML document with the invalid changes.
// The invalid changes cause schema validation errors.
document.Validate(ValidationEventHandler);
// Correct the invalid change to the first price element.
priceNode.InnerXml = "8.99";
// Validate only the first book element. The last book
// element is invalid, but not included in validation.
XmlNode bookNode = document.SelectSingleNode(@"/bk:bookstore/bk:book", manager);
document.Validate(ValidationEventHandler, bookNode);
}
catch (XmlException ex)
{
Console.WriteLine($"XmlDocumentValidationExample.XmlException: {ex.Message}");
}
catch(XmlSchemaValidationException ex)
{
Console.WriteLine($"XmlDocumentValidationExample.XmlSchemaValidationException: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"XmlDocumentValidationExample.Exception: {ex.Message}");
}
}
static void ValidationEventHandler(object sender, System.Xml.Schema.ValidationEventArgs args)
{
if (args.Severity == XmlSeverityType.Warning)
Console.Write("\nWARNING: ");
else if (args.Severity == XmlSeverityType.Error)
Console.Write("\nERROR: ");
Console.WriteLine(args.Message);
}
}
Imports System.Xml
Imports System.Xml.Schema
Class XmlDocumentValidationExample
Shared Sub Main()
Try
' Create a new XmlDocument instance and load
' the XML document into the DOM.
Dim document As XmlDocument = New XmlDocument()
document.Load("contosoBooks.xml")
' Add the XML schema for the XML document to the
' Schemas property of the XmlDocument.
document.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd")
' Validate the XML document loaded into the DOM.
document.Validate(AddressOf ValidationEventHandler)
' Make an invalid change to the first and last
' price elements in the XML document, and write
' the XmlSchemaInfo values assigned to the price
' element during validation to the console.
Dim manager As XmlNamespaceManager = New XmlNamespaceManager(document.NameTable)
manager.AddNamespace("bk", "http://www.contoso.com/books")
Dim priceNode As XmlNode = document.SelectSingleNode("/bk:bookstore/bk:book/bk:price", manager)
Console.WriteLine("SchemaInfo.IsDefault: {0}", priceNode.SchemaInfo.IsDefault)
Console.WriteLine("SchemaInfo.IsNil: {0}", priceNode.SchemaInfo.IsNil)
Console.WriteLine("SchemaInfo.SchemaElement: {0}", priceNode.SchemaInfo.SchemaElement)
Console.WriteLine("SchemaInfo.SchemaType: {0}", priceNode.SchemaInfo.SchemaType)
Console.WriteLine("SchemaInfo.Validity: {0}", priceNode.SchemaInfo.Validity)
priceNode.InnerXml = "A"
Dim priceNodes As XmlNodeList = document.SelectNodes("/bk:bookstore/bk:book/bk:price", manager)
Dim lastprice As XmlNode = priceNodes(priceNodes.Count - 1)
lastprice.InnerXml = "B"
' Validate the XML document with the invalid changes.
' The invalid changes cause schema validation errors.
document.Validate(AddressOf ValidationEventHandler)
' Correct the invalid change to the first price element.
priceNode.InnerXml = "8.99"
' Validate only the first book element. The last book
' element is invalid, but not included in validation.
Dim bookNode As XmlNode = document.SelectSingleNode("/bk:bookstore/bk:book", manager)
document.Validate(AddressOf ValidationEventHandler, bookNode)
Catch ex As XmlException
Console.WriteLine("XmlDocumentValidationExample.XmlException: {0}", ex.Message)
Catch ex As XmlSchemaValidationException
Console.WriteLine("XmlDocumentValidationExample.XmlSchemaValidationException: {0}", ex.Message)
Catch ex As Exception
Console.WriteLine("XmlDocumentValidationExample.Exception: {0}", ex.Message)
End Try
End Sub
Shared Sub ValidationEventHandler(ByVal sender As Object, ByVal args As ValidationEventArgs)
If args.Severity = XmlSeverityType.Warning Then
Console.Write(vbCrLf & "WARNING: ")
Else
If args.Severity = XmlSeverityType.Error Then
Console.Write(vbCrLf & "ERROR: ")
End If
End If
Console.WriteLine(args.Message)
End Sub
End Class
O exemplo usa como entrada os contosoBooks.xml arquivos e contosoBooks.xsd mencionados em "Validando um documento XML como ele é carregado no DOM" acima.
Tratamento de erros e avisos de validação
Os erros de validação do esquema XML são relatados ao validar dados XML carregados no DOM. Você será notificado sobre todos os erros de validação de esquema encontrados durante a validação dos dados XML enquanto eles estão sendo carregados ou ao validar um documento XML não validado anteriormente.
Os erros de validação são tratados pelo ValidationEventHandler. Se um ValidationEventHandler foi atribuído à XmlReaderSettings instância ou passado para o ValidateXmlDocument método da classe, o ValidationEventHandler manipulará erros de validação de esquema, caso contrário, um XmlSchemaValidationException será gerado quando um erro de validação de esquema for encontrado.
Observação
Os dados XML são carregados no DOM apesar dos erros de validação do esquema, a menos que você ValidationEventHandler gere uma exceção para interromper o processo.
Os avisos de validação de esquema não são relatados, a menos que o ReportValidationWarnings sinalizador seja especificado para o XmlReaderSettings objeto.
Para obter exemplos ilustrando o ValidationEventHandler, consulte "Validando um documento XML como ele é carregado no DOM" e "Validando um documento XML no DOM" acima.