Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
La XmlSchemaValidator classe fournit un mécanisme efficace et hautes performances pour valider les données XML par rapport aux schémas XML de manière push. Par exemple, la XmlSchemaValidator classe vous permet de valider un ensemble d’informations XML sur place sans avoir à le sérialiser en tant que document XML, puis à réparer le document à l’aide d’un lecteur XML de validation.
La XmlSchemaValidator classe peut être utilisée dans des scénarios avancés tels que la création de moteurs de validation sur des sources de données XML personnalisées ou comme moyen de générer un enregistreur XML de validation.
Voici un exemple d’utilisation de la XmlSchemaValidator classe pour valider le contosoBooks.xml
fichier par rapport au contosoBooks.xsd
schéma. L’exemple utilise la XmlSerializer classe pour désérialiser le contosoBooks.xml
fichier et passer la valeur des nœuds aux méthodes de la XmlSchemaValidator classe.
Remarque
Cet exemple est utilisé dans les sections de cette rubrique.
using System;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
using System.Collections;
namespace Microsoft.Samples.Xml.Schema
{
class XmlSchemaValidatorExamples
{
static void Main()
{
// The XML document to deserialize into the XmlSerializer object.
XmlReader reader = XmlReader.Create("contosoBooks.xml");
// The XmlSerializer object.
XmlSerializer serializer = new XmlSerializer(typeof(ContosoBooks));
ContosoBooks books = (ContosoBooks)serializer.Deserialize(reader);
// The XmlSchemaSet object containing the schema used to validate the XML document.
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add("http://www.contoso.com/books", "contosoBooks.xsd");
// The XmlNamespaceManager object used to handle namespaces.
XmlNamespaceManager manager = new XmlNamespaceManager(reader.NameTable);
// Assign a ValidationEventHandler to handle schema validation warnings and errors.
XmlSchemaValidator validator = new XmlSchemaValidator(reader.NameTable, schemaSet, manager, XmlSchemaValidationFlags.None);
validator.ValidationEventHandler += new ValidationEventHandler(SchemaValidationEventHandler);
// Initialize the XmlSchemaValidator object.
validator.Initialize();
// Validate the bookstore element, verify that all required attributes are present
// and prepare to validate child content.
validator.ValidateElement("bookstore", "http://www.contoso.com/books", null);
validator.GetUnspecifiedDefaultAttributes(new ArrayList());
validator.ValidateEndOfAttributes(null);
// Get the next expected element in the bookstore context.
XmlSchemaParticle[] particles = validator.GetExpectedParticles();
XmlSchemaElement nextElement = particles[0] as XmlSchemaElement;
Console.WriteLine($"Expected Element: '{nextElement.Name}'");
foreach (BookType book in books.Book)
{
// Validate the book element.
validator.ValidateElement("book", "http://www.contoso.com/books", null);
// Get the expected attributes for the book element.
Console.Write("\nExpected attributes: ");
XmlSchemaAttribute[] attributes = validator.GetExpectedAttributes();
foreach (XmlSchemaAttribute attribute in attributes)
{
Console.Write("'{0}' ", attribute.Name);
}
Console.WriteLine();
// Validate the genre attribute and display its post schema validation information.
if (book.Genre != null)
{
validator.ValidateAttribute("genre", "", book.Genre, schemaInfo);
}
DisplaySchemaInfo();
// Validate the publicationdate attribute and display its post schema validation information.
if (book.PublicationDate != null)
{
validator.ValidateAttribute("publicationdate", "", dateTimeGetter(book.PublicationDate), schemaInfo);
}
DisplaySchemaInfo();
// Validate the ISBN attribute and display its post schema validation information.
if (book.Isbn != null)
{
validator.ValidateAttribute("ISBN", "", book.Isbn, schemaInfo);
}
DisplaySchemaInfo();
// After validating all the attributes for the current element with ValidateAttribute method,
// you must call GetUnspecifiedDefaultAttributes to validate the default attributes.
validator.GetUnspecifiedDefaultAttributes(new ArrayList());
// Verify that all required attributes of the book element are present
// and prepare to validate child content.
validator.ValidateEndOfAttributes(null);
// Validate the title element and its content.
validator.ValidateElement("title", "http://www.contoso.com/books", null);
validator.ValidateEndElement(null, book.Title);
// Validate the author element, verify that all required attributes are present
// and prepare to validate child content.
validator.ValidateElement("author", "http://www.contoso.com/books", null);
validator.GetUnspecifiedDefaultAttributes(new ArrayList());
validator.ValidateEndOfAttributes(null);
if (book.Author.Name != null)
{
// Validate the name element and its content.
validator.ValidateElement("name", "http://www.contoso.com/books", null);
validator.ValidateEndElement(null, book.Author.Name);
}
if (book.Author.FirstName != null)
{
// Validate the first-name element and its content.
validator.ValidateElement("first-name", "http://www.contoso.com/books", null);
validator.ValidateEndElement(null, book.Author.FirstName);
}
if (book.Author.LastName != null)
{
// Validate the last-name element and its content.
validator.ValidateElement("last-name", "http://www.contoso.com/books", null);
validator.ValidateEndElement(null, book.Author.LastName);
}
// Validate the content of the author element.
validator.ValidateEndElement(null);
// Validate the price element and its content.
validator.ValidateElement("price", "http://www.contoso.com/books", null);
validator.ValidateEndElement(null, book.Price);
// Validate the content of the book element.
validator.ValidateEndElement(null);
}
// Validate the content of the bookstore element.
validator.ValidateEndElement(null);
// Close the XmlReader object.
reader.Close();
}
static XmlSchemaInfo schemaInfo = new XmlSchemaInfo();
static object dateTimeGetterContent;
static object dateTimeGetterHandle()
{
return dateTimeGetterContent;
}
static XmlValueGetter dateTimeGetter(DateTime dateTime)
{
dateTimeGetterContent = dateTime;
return new XmlValueGetter(dateTimeGetterHandle);
}
static void DisplaySchemaInfo()
{
if (schemaInfo.SchemaElement != null)
{
Console.WriteLine($"Element '{schemaInfo.SchemaElement.Name}' with type '{schemaInfo.SchemaType}' is '{schemaInfo.Validity}'");
}
else if (schemaInfo.SchemaAttribute != null)
{
Console.WriteLine($"Attribute '{schemaInfo.SchemaAttribute.Name}' with type '{schemaInfo.SchemaType}' is '{schemaInfo.Validity}'");
}
}
static void SchemaValidationEventHandler(object sender, ValidationEventArgs e)
{
switch (e.Severity)
{
case XmlSeverityType.Error:
Console.WriteLine($"\nError: {e.Message}");
break;
case XmlSeverityType.Warning:
Console.WriteLine($"\nWarning: {e.Message}");
break;
}
}
}
[XmlRootAttribute("bookstore", Namespace = "http://www.contoso.com/books", IsNullable = false)]
public class ContosoBooks
{
[XmlElementAttribute("book")]
public BookType[] Book;
}
public class BookType
{
[XmlAttributeAttribute("genre")]
public string Genre;
[XmlAttributeAttribute("publicationdate", DataType = "date")]
public DateTime PublicationDate;
[XmlAttributeAttribute("ISBN")]
public string Isbn;
[XmlElementAttribute("title")]
public string Title;
[XmlElementAttribute("author")]
public BookAuthor Author;
[XmlElementAttribute("price")]
public Decimal Price;
}
public class BookAuthor
{
[XmlElementAttribute("name")]
public string Name;
[XmlElementAttribute("first-name")]
public string FirstName;
[XmlElementAttribute("last-name")]
public string LastName;
}
}
Imports System.Xml
Imports System.Xml.Schema
Imports System.Xml.Serialization
Imports System.Collections
Namespace Microsoft.Samples.Xml.Schema
Class XmlSchemaValidatorExamples
Shared Sub Main()
' The XML document to deserialize into the XmlSerializer object.
Dim reader As XmlReader = XmlReader.Create("contosoBooks.xml")
' The XmlSerializer object.
Dim serializer As XmlSerializer = New XmlSerializer(GetType(ContosoBooks))
Dim books As ContosoBooks = CType(serializer.Deserialize(reader), ContosoBooks)
' The XmlSchemaSet object containing the schema used to validate the XML document.
Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()
schemaSet.Add("http://www.contoso.com/books", "contosoBooks.xsd")
' The XmlNamespaceManager object used to handle namespaces.
Dim manager As XmlNamespaceManager = New XmlNamespaceManager(reader.NameTable)
' Assign a ValidationEventHandler to handle schema validation warnings and errors.
Dim validator As XmlSchemaValidator = New XmlSchemaValidator(reader.NameTable, schemaSet, manager, XmlSchemaValidationFlags.None)
'validator.ValidationEventHandler += New ValidationEventHandler(SchemaValidationEventHandler)
AddHandler validator.ValidationEventHandler, AddressOf SchemaValidationEventHandler
' Initialize the XmlSchemaValidator object.
validator.Initialize()
' Validate the bookstore element, verify that all required attributes are present
' and prepare to validate child content.
validator.ValidateElement("bookstore", "http://www.contoso.com/books", Nothing)
validator.GetUnspecifiedDefaultAttributes(New ArrayList())
validator.ValidateEndOfAttributes(Nothing)
' Get the next expected element in the bookstore context.
Dim particles() As XmlSchemaParticle = validator.GetExpectedParticles()
Dim nextElement As XmlSchemaElement = particles(0)
Console.WriteLine("Expected Element: '{0}'", nextElement.Name)
For Each book As BookType In books.book
' Validate the book element.
validator.ValidateElement("book", "http://www.contoso.com/books", Nothing)
' Get the expected attributes for the book element.
Console.Write(vbCrLf & "Expected attributes: ")
Dim attributes() As XmlSchemaAttribute = validator.GetExpectedAttributes()
For Each attribute As XmlSchemaAttribute In attributes
Console.Write("'{0}' ", attribute.Name)
Next
Console.WriteLine()
' Validate the genre attribute and display its post schema validation information.
If Not book.Genre Is Nothing Then
validator.ValidateAttribute("genre", "", book.Genre, schemaInfo)
End If
DisplaySchemaInfo()
' Validate the publicationdate attribute and display its post schema validation information.
If Not book.PublicationDate = Nothing Then
validator.ValidateAttribute("publicationdate", "", dateTimeGetter(book.PublicationDate), schemaInfo)
End If
DisplaySchemaInfo()
' Validate the ISBN attribute and display its post schema validation information.
If Not book.Isbn Is Nothing Then
validator.ValidateAttribute("ISBN", "", book.Isbn, schemaInfo)
End If
DisplaySchemaInfo()
' After validating all the attributes for the current element with ValidateAttribute method,
' you must call GetUnspecifiedDefaultAttributes to validate the default attributes.
validator.GetUnspecifiedDefaultAttributes(New ArrayList())
' Verify that all required attributes of the book element are present
' and prepare to validate child content.
validator.ValidateEndOfAttributes(Nothing)
' Validate the title element and its content.
validator.ValidateElement("title", "http://www.contoso.com/books", Nothing)
validator.ValidateEndElement(Nothing, book.Title)
' Validate the author element, verify that all required attributes are present
' and prepare to validate child content.
validator.ValidateElement("author", "http://www.contoso.com/books", Nothing)
validator.GetUnspecifiedDefaultAttributes(New ArrayList())
validator.ValidateEndOfAttributes(Nothing)
If Not book.Author.Name Is Nothing Then
' Validate the name element and its content.
validator.ValidateElement("name", "http://www.contoso.com/books", Nothing)
validator.ValidateEndElement(Nothing, book.Author.Name)
End If
If Not book.Author.FirstName Is Nothing Then
' Validate the first-name element and its content.
validator.ValidateElement("first-name", "http://www.contoso.com/books", Nothing)
validator.ValidateEndElement(Nothing, book.Author.FirstName)
End If
If Not book.Author.LastName Is Nothing Then
' Validate the last-name element and its content.
validator.ValidateElement("last-name", "http://www.contoso.com/books", Nothing)
validator.ValidateEndElement(Nothing, book.Author.LastName)
End If
' Validate the content of the author element.
validator.ValidateEndElement(Nothing)
' Validate the price element and its content.
validator.ValidateElement("price", "http://www.contoso.com/books", Nothing)
validator.ValidateEndElement(Nothing, book.Price)
' Validate the content of the book element.
validator.ValidateEndElement(Nothing)
Next
' Validate the content of the bookstore element.
validator.ValidateEndElement(Nothing)
' Close the XmlReader object.
reader.Close()
End Sub
Shared schemaInfo As XmlSchemaInfo = New XmlSchemaInfo()
Shared dateTimeGetterContent As Object
Shared Function dateTimeGetterHandle() As Object
Return dateTimeGetterContent
End Function
Shared Function dateTimeGetter(ByVal dateTime As DateTime) As XmlValueGetter
dateTimeGetterContent = dateTime
Return New XmlValueGetter(AddressOf dateTimeGetterHandle)
End Function
Shared Sub DisplaySchemaInfo()
If Not schemaInfo.SchemaElement Is Nothing Then
Console.WriteLine("Element '{0}' with type '{1}' is '{2}'", schemaInfo.SchemaElement.Name, schemaInfo.SchemaType, schemaInfo.Validity)
ElseIf Not schemaInfo.SchemaAttribute Is Nothing Then
Console.WriteLine("Attribute '{0}' with type '{1}' is '{2}'", schemaInfo.SchemaAttribute.Name, schemaInfo.SchemaType, schemaInfo.Validity)
End If
End Sub
Shared Sub SchemaValidationEventHandler(ByVal sender As Object, ByVal e As ValidationEventArgs)
Select Case e.Severity
Case XmlSeverityType.Error
Console.WriteLine(vbCrLf & "Error: {0}", e.Message)
Exit Sub
Case XmlSeverityType.Warning
Console.WriteLine(vbCrLf & "Warning: {0}", e.Message)
Exit Sub
End Select
End Sub
End Class
<XmlRootAttribute("bookstore", Namespace:="http://www.contoso.com/books", IsNullable:=False)> _
Public Class ContosoBooks
<XmlElementAttribute("book")> _
Public book() As BookType
End Class
Public Class BookType
<XmlAttributeAttribute("genre")> _
Public Genre As String
<XmlAttributeAttribute("publicationdate", DataType:="date")> _
Public PublicationDate As DateTime
<XmlAttributeAttribute("ISBN")> _
Public Isbn As String
<XmlElementAttribute("title")> _
Public Title As String
<XmlElementAttribute("author")> _
Public Author As BookAuthor
<XmlElementAttribute("price")> _
Public Price As Decimal
End Class
Public Class BookAuthor
<XmlElementAttribute("name")> _
Public Name As String
<XmlElementAttribute("first-name")> _
Public FirstName As String
<XmlElementAttribute("last-name")> _
Public LastName As String
End Class
End Namespace
L’exemple prend le fichier contosoBooks.xml
comme entrée.
<?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>
L’exemple considère également contosoBooks.xsd
comme entrée.
<?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>
Validation des données XML à l’aide de XmlSchemaValidator
Pour commencer à valider un ensemble d’informations XML, vous devez d’abord initialiser une nouvelle instance de la classe XmlSchemaValidator à l’aide du constructeur XmlSchemaValidator.
Le XmlSchemaValidator constructeur accepte XmlNameTable, XmlSchemaSetet XmlNamespaceManager les objets en tant que paramètres, ainsi qu’une XmlSchemaValidationFlags valeur en tant que paramètre. L’objet XmlNameTable est utilisé pour atomiser des chaînes d’espace de noms connues telles que l’espace de noms de schéma, l’espace de noms XML, et ainsi de suite, et est passé à la méthode ParseValue en validant le contenu simple. L’objet XmlSchemaSet contient les schémas XML utilisés pour valider l’ensemble d’informations XML. L’objet XmlNamespaceManager est utilisé pour résoudre les espaces de noms rencontrés lors de la validation. La XmlSchemaValidationFlags valeur est utilisée pour désactiver certaines fonctionnalités de validation.
Pour plus d’informations sur le XmlSchemaValidator constructeur, consultez la documentation de référence sur la XmlSchemaValidator classe.
Initialisation de la validation
Une fois qu’un XmlSchemaValidator objet a été construit, il existe deux méthodes surchargées Initialize utilisées pour initialiser l’état de l’objet XmlSchemaValidator . Voici les deux Initialize méthodes.
La méthode par défaut XmlSchemaValidator.Initialize initialise un XmlSchemaValidator objet à son état de départ, et la méthode surchargée XmlSchemaValidator.Initialize qui prend un XmlSchemaObject paramètre initialise un XmlSchemaValidator objet à son état de départ pour la validation partielle.
Les deux Initialize méthodes peuvent uniquement être appelées immédiatement après la construction d’un XmlSchemaValidator objet ou après un appel à EndValidation.
Pour obtenir un exemple de méthode XmlSchemaValidator.Initialize , consultez l’exemple dans l’introduction. Pour plus d’informations sur la Initialize méthode, consultez la documentation de référence de XmlSchemaValidator classe.
Validation partielle
La XmlSchemaValidator.Initialize méthode qui prend un XmlSchemaObject paramètre initialise un XmlSchemaValidator objet à son état de départ pour la validation partielle.
Dans l'exemple suivant, un XmlSchemaObject est initialisé pour une validation partielle à l'aide de la méthode XmlSchemaValidator.Initialize. L'élément de schéma orderNumber
est passé en sélectionnant l'élément de schéma XmlQualifiedName dans la collection XmlSchemaObjectTable renvoyée par la propriété GlobalElements de l'objet XmlSchemaSet. L’objet XmlSchemaValidator valide ensuite cet élément spécifique.
Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()
schemaSet.Add(Nothing, "schema.xsd")
schemaSet.Compile()
Dim nameTable As NameTable = New NameTable()
Dim manager As XmlNamespaceManager = New XmlNamespaceManager(nameTable)
Dim validator As XmlSchemaValidator = New XmlSchemaValidator(nameTable, schemaSet, manager, XmlSchemaValidationFlags.None)
validator.Initialize(schemaSet.GlobalElements.Item(New XmlQualifiedName("orderNumber")))
validator.ValidateElement("orderNumber", "", Nothing)
validator.ValidateEndOfAttributes(Nothing)
validator.ValidateText("123")
validator.ValidateEndElement(Nothing)
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add(null, "schema.xsd");
schemaSet.Compile();
NameTable nameTable = new NameTable();
XmlNamespaceManager manager = new XmlNamespaceManager(nameTable);
XmlSchemaValidator validator = new XmlSchemaValidator(nameTable, schemaSet, manager, XmlSchemaValidationFlags.None);
validator.Initialize(schemaSet.GlobalElements[new XmlQualifiedName("orderNumber")]);
validator.ValidateElement("orderNumber", "", null);
validator.ValidateEndOfAttributes(null);
validator.ValidateText("123");
validator.ValidateEndElement(null);
L’exemple prend le schéma XML suivant comme entrée.
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="orderNumber" type="xs:int" />
</xs:schema>
Pour plus d’informations sur la Initialize méthode, consultez la documentation de référence de XmlSchemaValidator classe.
Ajout de schémas supplémentaires
La AddSchema méthode de la XmlSchemaValidator classe est utilisée pour ajouter un schéma XML au jeu de schémas utilisés lors de la validation. La AddSchema méthode peut être utilisée pour simuler l’effet de la rencontre d’un schéma XML inline dans l’ensemble d’informations XML validé.
Remarque
L’espace de noms cible du XmlSchema paramètre ne peut pas correspondre à celui d’un élément ou d’un attribut déjà rencontré par l’objet XmlSchemaValidator .
Si la XmlSchemaValidationFlags.ProcessInlineSchema valeur n’a pas été passée en tant que paramètre au XmlSchemaValidator constructeur, la AddSchema méthode ne fait rien.
Le résultat de la AddSchema méthode dépend du contexte de nœud XML actuel validé. Pour plus d’informations sur les contextes de validation, consultez la section « Contexte de validation » de cette rubrique.
Pour plus d’informations sur la AddSchema méthode, consultez la documentation de référence de XmlSchemaValidator classe.
Validation d’éléments, d’attributs et de contenu
La XmlSchemaValidator classe fournit plusieurs méthodes utilisées pour valider des éléments, des attributs et du contenu dans un ensemble d’informations XML sur des schémas XML. Le tableau suivant décrit chacune de ces méthodes.
Méthode | Descriptif |
---|---|
ValidateElement | Valide le nom de l’élément dans le contexte actuel. |
ValidateAttribute | Valide l’attribut dans le contexte d’élément actuel ou par rapport à l’objet XmlSchemaAttribute passé en tant que paramètre à la Initialize méthode. |
ValidateEndOfAttributes | Vérifie si tous les attributs requis dans le contexte d’élément sont présents et prépare l’objet XmlSchemaValidator pour valider le contenu enfant de l’élément. |
ValidateText | Vérifie si le texte est autorisé dans le contexte de l’élément actuel et accumule le texte pour la validation si l’élément actuel a du contenu simple. |
ValidateWhitespace | Vérifie si l’espace blanc est autorisé dans le contexte d’élément actuel et accumule l’espace blanc pour la validation si l’élément actuel a du contenu simple. |
ValidateEndElement | Vérifie si le contenu texte de l’élément est valide en fonction de son type de données pour les éléments avec du contenu simple et vérifie si le contenu de l’élément actuel est complet pour les éléments avec du contenu complexe. |
SkipToEndElement | Ignore la validation du contenu de l’élément actuel et prépare l’objet XmlSchemaValidator pour valider le contenu dans le contexte de l’élément parent. |
EndValidation | Termine la validation et vérifie les contraintes d’identité pour l’intégralité du document XML si l’option ProcessIdentityConstraints de validation est définie. |
Remarque
La XmlSchemaValidator classe a une transition d’état définie qui applique la séquence et l’occurrence des appels effectués à chacune des méthodes décrites dans le tableau précédent. La transition d’état spécifique de la XmlSchemaValidator classe est décrite dans la section « XmlSchemaValidator State Transition » de cette rubrique.
Pour obtenir un exemple des méthodes utilisées pour valider des éléments, des attributs et du contenu dans un ensemble d’informations XML, consultez l’exemple de la section précédente. Pour plus d’informations sur ces méthodes, consultez la documentation de référence de XmlSchemaValidator classe.
Validation du contenu à l’aide d’un XmlValueGetter
Les XmlValueGetterdelegate
peuvent être utilisés pour convertir la valeur des nœuds d’attribut, de texte ou d’espace blanc en types CLR (Common Language Runtime) compatibles avec le type XSD (XML Schema Definition Language) de l’attribut, du texte ou du nœud d’espace blanc. Un objet XmlValueGetterdelegate
s’avère utile si la valeur CLR d’un nœud d’attribut, de texte ou d’espace blanc est déjà disponible ; il évite de devoir la convertir en une string
et la réanalyser pour la valider.
Les méthodes ValidateAttribute, ValidateText, et ValidateWhitespace sont surchargées et acceptent la valeur des nœuds d’attribut, de texte ou d’espace blanc en tant que string
ou XmlValueGetterdelegate
.
Les méthodes suivantes de la XmlSchemaValidator classe acceptent un XmlValueGetterdelegate
paramètre.
Voici un exemple XmlValueGetterdelegate
extrait de l’exemple de classe XmlSchemaValidator présenté dans l’introduction. Renvoie XmlValueGetterdelegate
la valeur d’un attribut en tant qu’objet DateTime . Pour valider cet DateTime objet retourné par le XmlValueGetter, l’objet XmlSchemaValidator le convertit d’abord en ValueType (ValueType est le mappage CLR par défaut pour le type XSD) pour le type de données de l’attribut, puis vérifie les facettes sur la valeur convertie.
Shared dateTimeGetterContent As Object
Shared Function DateTimeGetterHandle() As Object
Return dateTimeGetterContent
End Function
Shared Function DateTimeGetter(dateTime As DateTime) As XmlValueGetter
dateTimeGetterContent = dateTime
Return New XmlValueGetter(AddressOf DateTimeGetterHandle)
End Function
static object dateTimeGetterContent;
static object DateTimeGetterHandle()
{
return dateTimeGetterContent;
}
static XmlValueGetter DateTimeGetter(DateTime dateTime)
{
dateTimeGetterContent = dateTime;
return new XmlValueGetter(dateTimeGetterHandle);
}
Pour obtenir un exemple complet de l’exemple XmlValueGetterdelegate
, consultez l’exemple dans l’introduction. Pour plus d’informations sur les XmlValueGetterdelegate
, consultez la documentation de référence sur les classes XmlValueGetter et XmlSchemaValidator.
Informations de post-validation de schéma
La classe XmlSchemaInfo représente certains éléments du post-schéma-Validation-Information d’un nœud XML validé par la classe XmlSchemaValidator. Différentes méthodes de la XmlSchemaValidator classe acceptent un XmlSchemaInfo objet comme paramètre facultatif (null
). out
Une fois la validation réussie, les propriétés de l’objet XmlSchemaInfo sont définies avec les résultats de la validation. Par exemple, lors de la validation réussie d’un attribut à l’aide de la méthode ValidateAttribute, les propriétés de l'objet XmlSchemaInfo (si spécifiées) SchemaAttribute, SchemaType, MemberType, et Validity sont définies avec les résultats de la validation.
Les méthodes de classe suivantes XmlSchemaValidator acceptent un XmlSchemaInfo objet en tant que paramètre out.
Pour obtenir un exemple complet de la XmlSchemaInfo classe, consultez l’exemple dans l’introduction. Pour plus d’informations sur la classe XmlSchemaInfo, consultez la documentation de référence de la classe XmlSchemaInfo.
Récupération des particules attendues, des attributs et des attributs par défaut non spécifiés
La classe XmlSchemaValidator fournit les méthodes GetExpectedAttributes, GetExpectedParticles, et GetUnspecifiedDefaultAttributes pour récupérer les particules attendues, les attributs et les attributs par défaut non spécifiés dans le contexte de validation actuel.
Récupération des particules attendues
La GetExpectedParticles méthode retourne un tableau d’objets XmlSchemaParticle contenant les particules attendues dans le contexte d’élément actuel. Les particules valides qui peuvent être retournées par la méthode GetExpectedParticles sont des instances des classes XmlSchemaElement et XmlSchemaAny.
Lorsque le compositeur du modèle de contenu est un xs:sequence
, seule la particule suivante de la séquence est retournée. Si le constructeur du modèle de contenu est xs:all
ou xs:choice
, toutes les particules valides pouvant suivre dans le contexte de l'élément actuel sont retournées.
Remarque
Si la GetExpectedParticles méthode est appelée immédiatement après l’appel de la Initialize méthode, la GetExpectedParticles méthode retourne tous les éléments globaux.
Par exemple, dans le schéma XSD (XML Schema Definition Language) et le document XML qui suivent, après avoir validé l’élément book
, l’élément book
est le contexte d’élément actuel. La GetExpectedParticles méthode retourne un tableau contenant un seul XmlSchemaElement objet représentant l’élément title
. Lorsque le contexte de validation est l’élément title
, la GetExpectedParticles méthode retourne un tableau vide. Si la GetExpectedParticles méthode est appelée après la validation de l’élément title
, mais avant la validation de l’élément description
, elle retourne un tableau contenant un seul XmlSchemaElement objet représentant l’élément description
. Si la GetExpectedParticles méthode est appelée après la validation de l’élément description
, elle retourne un tableau contenant un seul XmlSchemaAny objet représentant le caractère générique.
Dim reader As XmlReader = XmlReader.Create("input.xml")
Dim schemaSet As New XmlSchemaSet()
schemaSet.Add(Nothing, "schema.xsd")
Dim manager As New XmlNamespaceManager(reader.NameTable)
Dim validator As New XmlSchemaValidator(reader.NameTable,schemaSet,manager,XmlSchemaValidationFlags.None)
validator.Initialize()
validator.ValidateElement("book", "", Nothing)
validator.ValidateEndOfAttributes(Nothing)
For Each element As XmlSchemaElement In validator.GetExpectedParticles()
Console.WriteLine(element.Name)
Next
validator.ValidateElement("title", "", Nothing)
validator.ValidateEndOfAttributes(Nothing)
For Each element As XmlSchemaElement In validator.GetExpectedParticles()
Console.WriteLine(element.Name)
Next
validator.ValidateEndElement(Nothing)
For Each element As XmlSchemaElement In validator.GetExpectedParticles()
Console.WriteLine(element.Name)
Next
validator.ValidateElement("description", "", Nothing)
validator.ValidateEndOfAttributes(Nothing)
validator.ValidateEndElement(Nothing)
For Each particle As XmlSchemaParticle In validator.GetExpectedParticles()
Console.WriteLine(particle.GetType())
Next
validator.ValidateElement("namespace", "", Nothing)
validator.ValidateEndOfAttributes(Nothing)
validator.ValidateEndElement(Nothing)
validator.ValidateEndElement(Nothing)
XmlReader reader = XmlReader.Create("input.xml");
var schemaSet = new XmlSchemaSet();
schemaSet.Add(null, "schema.xsd");
var manager = new XmlNamespaceManager(reader.NameTable);
var validator = new XmlSchemaValidator(reader.NameTable, schemaSet, manager, XmlSchemaValidationFlags.None);
validator.Initialize();
validator.ValidateElement("book", "", null);
validator.ValidateEndOfAttributes(null);
foreach (XmlSchemaElement element in validator.GetExpectedParticles())
{
Console.WriteLine(element.Name);
}
validator.ValidateElement("title", "", null);
validator.ValidateEndOfAttributes(null);
foreach (XmlSchemaElement element in validator.GetExpectedParticles())
{
Console.WriteLine(element.Name);
}
validator.ValidateEndElement(null);
foreach (XmlSchemaElement element in validator.GetExpectedParticles())
{
Console.WriteLine(element.Name);
}
validator.ValidateElement("description", "", null);
validator.ValidateEndOfAttributes(null);
validator.ValidateEndElement(null);
foreach (XmlSchemaParticle particle in validator.GetExpectedParticles())
{
Console.WriteLine(particle.GetType());
}
validator.ValidateElement("namespace", "", null);
validator.ValidateEndOfAttributes(null);
validator.ValidateEndElement(null);
validator.ValidateEndElement(null);
L’exemple prend le code XML suivant comme entrée :
<xs:schema xmlns:xs="http://www.w3c.org/2001/XMLSchema">
<xs:element name="book">
<xs:sequence>
<xs:element name="title" type="xs:string" />
<xs:element name="description" type="xs:string" />
<xs:any processContent="lax" maxOccurs="unbounded" />
</xs:sequence>
</xs:element>
</xs:schema>
L’exemple prend le schéma XSD suivant comme entrée :
<book>
<title>My Book</title>
<description>My Book's Description</description>
<namespace>System.Xml.Schema</namespace>
</book>
Remarque
Les résultats des méthodes GetExpectedParticles, GetExpectedAttributes, et AddSchema de la classe XmlSchemaValidator dépendent du contexte actuel à valider. Pour plus d’informations, consultez la section « Contexte de validation » de cette rubrique.
Pour obtenir un exemple de méthode GetExpectedParticles , consultez l’exemple dans l’introduction. Pour plus d’informations sur la GetExpectedParticles méthode, consultez la documentation de référence de XmlSchemaValidator classe.
Récupération des attributs attendus
La GetExpectedAttributes méthode retourne un tableau d’objets contenant les attributs attendus dans le contexte d’élément XmlSchemaAttribute actuel.
Par exemple, dans l’exemple de l’introduction, la GetExpectedAttributes méthode est utilisée pour récupérer tous les attributs de l’élément book
.
Si vous appelez la GetExpectedAttributes méthode immédiatement après la ValidateElement méthode, tous les attributs pouvant apparaître dans le document XML sont retournés. Toutefois, si vous appelez la GetExpectedAttributes méthode après un ou plusieurs appels à la ValidateAttribute méthode, les attributs qui n’ont pas encore été validés pour l’élément actuel sont retournés.
Remarque
Les résultats des méthodes GetExpectedParticles, GetExpectedAttributes, et AddSchema de la classe XmlSchemaValidator dépendent du contexte actuel à valider. Pour plus d’informations, consultez la section « Contexte de validation » de cette rubrique.
Pour obtenir un exemple de méthode GetExpectedAttributes , consultez l’exemple dans l’introduction. Pour plus d’informations sur la GetExpectedAttributes méthode, consultez la documentation de référence de XmlSchemaValidator classe.
Récupération d’attributs par défaut non spécifiés
La méthode GetUnspecifiedDefaultAttributes remplit l'objet ArrayList spécifié avec des objets XmlSchemaAttribute pour tous les attributs ayant des valeurs par défaut qui n'ont pas encore été validés à l'aide de la méthode ValidateAttribute dans le contexte de l'élément. La GetUnspecifiedDefaultAttributes méthode doit être appelée après avoir appelé la ValidateAttribute méthode sur chaque attribut dans le contexte d’élément. La GetUnspecifiedDefaultAttributes méthode doit être utilisée pour déterminer quels attributs par défaut doivent être insérés dans le document XML en cours de validation.
Pour plus d’informations sur la GetUnspecifiedDefaultAttributes méthode, consultez la documentation de référence de XmlSchemaValidator classe.
Gestion des événements de validation de schéma
Les avertissements et erreurs de validation de schéma rencontrés pendant la validation sont gérés par l’événement ValidationEventHandler de la XmlSchemaValidator classe.
Les avertissements de validation de schéma ont une valeur XmlSeverityType de Warning, et les erreurs de validation de schéma ont une valeur XmlSeverityType de Error. Si aucun événement ValidationEventHandler n’a été assigné, un objet XmlSchemaValidationException est levé pour toutes les erreurs de validation de schéma ayant XmlSeverityType comme valeur Error. Toutefois, cet objet XmlSchemaValidationException n’est pas levé pour les avertissements de validation de schéma dont l’objet XmlSeverityType a pour valeur Warning.
Voici un exemple d’un ValidationEventHandler qui reçoit des avertissements et des erreurs rencontrés lors de la validation de schéma, extrait de l’exemple mentionné dans l’introduction.
Shared Sub SchemaValidationEventHandler(sender As Object, e As ValidationEventArgs)
Select Case e.Severity
Case XmlSeverityType.Error
Console.WriteLine(vbCrLf & "Error: {0}", e.Message)
Exit Sub
Case XmlSeverityType.Warning
Console.WriteLine(vbCrLf & "Warning: {0}", e.Message)
Exit Sub
End Select
End Sub
static void SchemaValidationEventHandler(object sender, ValidationEventArgs e)
{
switch (e.Severity)
{
case XmlSeverityType.Error:
Console.WriteLine("\nError: {0}", e.Message);
break;
case XmlSeverityType.Warning:
Console.WriteLine("\nWarning: {0}", e.Message);
break;
}
}
Pour obtenir un exemple complet de l’exemple ValidationEventHandler, consultez l’exemple dans l’introduction. Pour plus d’informations, consultez la documentation de référence de XmlSchemaInfo classe.
Transition d'état du validateur de schéma XML
La XmlSchemaValidator classe a une transition d’état définie qui applique la séquence et l’occurrence des appels effectués à chacune des méthodes utilisées pour valider des éléments, des attributs et du contenu dans un ensemble d’informations XML.
Le tableau suivant décrit la transition d’état de la XmlSchemaValidator classe, ainsi que la séquence et l’occurrence des appels de méthode qui peuvent être effectués dans chaque état.
État | Transition |
---|---|
Valider | Initialize (ValidateAttribute | TopLevel*) EndValidation |
Niveau Supérieur | ValidateWhitespace | ValidateText | Élément |
Élément |
ValidateElement
ValidateAttribute* (ValidateEndOfAttributes Contenu*) ? ValidateEndElement | ValidateElement ValidateAttribute * SkipToEndElement | ValidateElement ValidateAttribute * ValidateEndOfAttributes Contenu* SkipToEndElement | |
Contenu | ValidateWhitespace | ValidateText | Élément |
Remarque
Un objet InvalidOperationException est levé par chacune des méthodes dans le tableau ci-dessus lorsque l'appel à la méthode est effectué dans l'ordre incorrect d'après l'état actuel d'un objet XmlSchemaValidator.
La table de transition d’état ci-dessus utilise des symboles de ponctuation pour décrire les méthodes et d’autres états qui peuvent être appelés pour chaque état de la transition d’état de la XmlSchemaValidator classe. Les symboles utilisés sont les mêmes que ceux trouvés dans la référence de normes XML pour la définition de type de document (DTD).
Le tableau suivant décrit comment les symboles de ponctuation trouvés dans la table de transition d’état ci-dessus affectent les méthodes et d’autres états qui peuvent être appelés pour chaque état dans la transition d’état de la XmlSchemaValidator classe.
Symbole | Descriptif |
---|---|
| | La méthode ou l'état au choix (celui qui se trouve devant la barre ou après la barre) peut être appelé. |
? | La méthode ou l’état qui précède le point d’interrogation est facultatif, mais s’il est appelé, il ne peut être appelé qu’une seule fois. |
* | La méthode ou l’état qui précède le symbole * est facultatif et peut être appelé plusieurs fois. |
Contexte de validation
Les méthodes de la XmlSchemaValidator classe utilisées pour valider des éléments, des attributs et du contenu dans un jeu d’informations XML, modifient le contexte de validation d’un XmlSchemaValidator objet. Par exemple, la méthode SkipToEndElement ignore la validation du contenu de l’élément actuel et prépare l’objet XmlSchemaValidator à valider le contenu dans le contexte de l’élément parent ; cela équivaut à ignorer la validation pour tous les enfants de l’élément actuel, puis à appeler la méthode ValidateEndElement.
Les résultats des méthodes GetExpectedParticles, GetExpectedAttributes, et AddSchema de la classe XmlSchemaValidator dépendent du contexte actuel à valider.
Le tableau suivant décrit les résultats de l’appel de ces méthodes après avoir appelé l’une des méthodes de la XmlSchemaValidator classe utilisées pour valider des éléments, des attributs et du contenu dans un ensemble d’informations XML.
Méthode | GetExpectedParticles | GetExpectedAttributes | AjouterSchéma |
---|---|---|---|
Initialize | Si la méthode par défaut Initialize est appelée, GetExpectedParticles retourne un tableau contenant tous les éléments globaux. Si la méthode surchargée Initialize qui prend un XmlSchemaObject paramètre est appelée pour initialiser la validation partielle d’un élément, GetExpectedParticles retourne uniquement l’élément auquel l’objet XmlSchemaValidator a été initialisé. |
Si la méthode par défaut Initialize est appelée, GetExpectedAttributes retourne un tableau vide. Si la surcharge de la méthode Initialize prenant un paramètre XmlSchemaObject est appelée pour initialiser la validation partielle d’un attribut, GetExpectedAttributes retourne uniquement l’attribut auquel l'objet XmlSchemaValidator a été initialisé. |
Ajoute le schéma à l’objet XmlSchemaSetXmlSchemaValidator si aucune erreur de prétraitement n'est présente. |
ValidateElement | Si l’élément de contexte est valide, GetExpectedParticles retourne la séquence d’éléments attendus en tant qu’enfants de l’élément de contexte. Si l’élément de contexte n’est pas valide, GetExpectedParticles retourne un tableau vide. |
Si l’élément de contexte est valide et si aucun appel n’a ValidateAttribute été effectué précédemment, GetExpectedAttributes retourne une liste de tous les attributs définis sur l’élément de contexte. Si certains attributs ont déjà été validés, GetExpectedAttributes retourne une liste des attributs restants à valider. Si l’élément de contexte n’est pas valide, GetExpectedAttributes retourne un tableau vide. |
Identique à ce qui précède. |
ValidateAttribute | Si l’attribut de contexte est un attribut de niveau supérieur, GetExpectedParticles retourne un tableau vide. Sinon, la méthode GetExpectedParticles retourne la séquence d'éléments attendus comme premier enfant de l'élément de contexte. |
Si l’attribut de contexte est un attribut de niveau supérieur, GetExpectedAttributes retourne un tableau vide. Sinon GetExpectedAttributes , retourne la liste des attributs restants à valider. |
Identique à ce qui précède. |
GetUnspecifiedDefaultAttributes | GetExpectedParticles retourne la séquence d’éléments attendus comme premier enfant de l’élément de contexte. | GetExpectedAttributes retourne une liste des attributs obligatoires et facultatifs qui ne sont pas encore validés pour l’élément de contexte. | Identique à ce qui précède. |
ValidateEndOfAttributes | GetExpectedParticles retourne la séquence d’éléments attendus comme premier enfant de l’élément de contexte. | GetExpectedAttributes retourne un tableau vide. | Identique à ce qui précède. |
ValidateText | Si le contentType de l’élément de contexte est mixte, GetExpectedParticles retourne la séquence d’éléments attendus à la position suivante. Si le contentType de l’élément de contexte est TextOnly ou Empty, GetExpectedParticles retourne un tableau vide. Si le contentType de l’élément de contexte est ElementOnly, retourne la séquence d’éléments attendus à la position suivante, GetExpectedParticles mais une erreur de validation s’est déjà produite. |
GetExpectedAttributes retourne la liste des attributs non validés de l’élément de contexte. | Identique à ce qui précède. |
ValidateWhitespace | Si l’espace blanc du contexte est un espace blanc de niveau supérieur, GetExpectedParticles retourne un tableau vide. Sinon, le comportement de la GetExpectedParticles méthode est le même que dans ValidateText. |
Si l’espace blanc du contexte est un espace blanc de niveau supérieur, GetExpectedAttributes retourne un tableau vide. Sinon, le comportement de la GetExpectedAttributes méthode est le même que dans ValidateText. |
Identique à ce qui précède. |
ValidateEndElement | GetExpectedParticles retourne la séquence d’éléments attendus après l’élément de contexte (frères possibles). |
GetExpectedAttributes retourne la liste des attributs non validés de l’élément de contexte. Si l’élément de contexte n’a pas de parent, GetExpectedAttributes retourne une liste vide (l’élément de contexte est le parent de l’élément actuel sur lequel ValidateEndElement il a été appelé). |
Identique à ce qui précède. |
SkipToEndElement | Identique à ValidateEndElement. | Identique à ValidateEndElement. | Identique à ce qui précède. |
EndValidation | Retourne un tableau vide. | Retourne un tableau vide. | Identique à ce qui précède. |
Remarque
Les valeurs retournées par les différentes propriétés de la XmlSchemaValidator classe ne sont pas modifiées en appelant l’une des méthodes du tableau ci-dessus.