Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
La XmlSchemaValidator classe fornisce un meccanismo efficiente e ad alte prestazioni per convalidare i dati XML rispetto agli schemi XML in modo basato su push. Ad esempio, la XmlSchemaValidator classe consente di convalidare un infoset XML sul posto senza doverlo serializzare come documento XML e quindi riparse il documento usando un lettore XML di convalida.
La XmlSchemaValidator classe può essere usata in scenari avanzati, ad esempio la compilazione di motori di convalida su origini dati XML personalizzate o come modo per compilare un writer XML di convalida.
Di seguito è riportato un esempio di utilizzo della XmlSchemaValidator classe per convalidare il contosoBooks.xml file rispetto allo contosoBooks.xsd schema. Nell'esempio viene utilizzata la XmlSerializer classe per deserializzare il contosoBooks.xml file e passare il valore dei nodi ai metodi della XmlSchemaValidator classe .
Annotazioni
Questo esempio viene usato in tutte le sezioni di questo argomento.
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'esempio accetta il file contosoBooks.xml come input.
<?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'esempio accetta anche contosoBooks.xsd come input.
<?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>
Convalida dei dati XML tramite XmlSchemaValidator
Per iniziare a convalidare un infoset XML, è prima necessario inizializzare una nuova istanza della XmlSchemaValidator classe usando il XmlSchemaValidator costruttore .
Il XmlSchemaValidator costruttore accetta XmlNameTablegli oggetti , XmlSchemaSete XmlNamespaceManager come parametri, nonché un XmlSchemaValidationFlags valore come parametro. L'oggetto XmlNameTable viene usato per atomizzare stringhe note dello spazio dei nomi, come lo spazio dei nomi dello schema e lo spazio dei nomi XML, e viene passato al metodo ParseValue durante la convalida di contenuto semplice. L'oggetto XmlSchemaSet contiene gli XML Schema utilizzati per convalidare l'infoset XML. L'oggetto XmlNamespaceManager viene usato per risolvere i namespace rilevati durante la convalida. Il XmlSchemaValidationFlags valore viene usato per disabilitare determinate funzionalità di convalida.
Per ulteriori informazioni sul costruttore XmlSchemaValidator, consultare la documentazione di riferimento della classe XmlSchemaValidator.
Inizializzazione della convalida
Dopo che un XmlSchemaValidator oggetto è stato costruito, ci sono due metodi Initialize sovraccaricati che vengono utilizzati per inizializzare lo stato dell'oggetto XmlSchemaValidator. Di seguito sono riportati i due Initialize metodi.
Il metodo predefinito XmlSchemaValidator.Initialize inizializza un XmlSchemaValidator oggetto allo stato iniziale e il metodo di XmlSchemaValidator.Initialize overload che accetta come XmlSchemaObject parametro inizializza un XmlSchemaValidator oggetto allo stato iniziale per la convalida parziale.
Entrambi i Initialize metodi possono essere chiamati immediatamente dopo la costruzione di un XmlSchemaValidator oggetto o dopo una chiamata a EndValidation.
Per un esempio del XmlSchemaValidator.Initialize metodo , vedere l'esempio nell'introduzione. Per altre informazioni sul Initialize metodo, vedere la documentazione di riferimento sulla XmlSchemaValidator classe.
Convalida parziale
Il XmlSchemaValidator.Initialize metodo che accetta come XmlSchemaObject parametro inizializza un XmlSchemaValidator oggetto allo stato iniziale per la convalida parziale.
Nell'esempio seguente, un oggetto XmlSchemaObject viene inizializzato per la convalida parziale usando il XmlSchemaValidator.Initialize metodo . L'elemento orderNumber dello schema viene trasferito selezionando l'elemento dello schema tramite XmlQualifiedName nella raccolta XmlSchemaObjectTable restituita dalla proprietà GlobalElements dell'oggetto XmlSchemaSet. L'oggetto XmlSchemaValidator convalida quindi questo elemento specifico.
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'esempio accetta il seguente schema XML come input.
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="orderNumber" type="xs:int" />
</xs:schema>
Per altre informazioni sul Initialize metodo, vedere la documentazione di riferimento sulla XmlSchemaValidator classe.
Aggiunta di schemi aggiuntivi
Il AddSchema metodo della XmlSchemaValidator classe viene utilizzato per aggiungere uno schema XML al set di schemi utilizzato durante la convalida. Il AddSchema metodo può essere utilizzato per simulare l'effetto di incontrare un XML Schema inline nell'infoset XML in fase di convalida.
Annotazioni
Lo spazio dei nomi di destinazione del XmlSchema parametro non può corrispondere a quello di qualsiasi elemento o attributo già rilevato dall'oggetto XmlSchemaValidator .
Se il XmlSchemaValidationFlags.ProcessInlineSchema valore non è stato passato come parametro al XmlSchemaValidator costruttore, il AddSchema metodo non esegue alcuna operazione.
Il risultato del AddSchema metodo dipende dal contesto del nodo XML corrente da convalidare. Per altre informazioni sui contesti di convalida, vedere la sezione "Contesto di convalida" di questo argomento.
Per altre informazioni sul AddSchema metodo, vedere la documentazione di riferimento sulla XmlSchemaValidator classe.
Convalida di elementi, attributi e contenuto
La XmlSchemaValidator classe fornisce diversi metodi usati per convalidare elementi, attributi e contenuto in un infoset XML rispetto agli XML Schema. Nella tabella seguente vengono descritti ognuno di questi metodi.
| Metodo | Descrizione |
|---|---|
| ValidateElement | Convalida il nome dell'elemento nel contesto corrente. |
| ValidateAttribute | Convalida l'attributo nel contesto dell'elemento corrente o rispetto all'oggetto XmlSchemaAttribute passato come parametro al Initialize metodo . |
| ValidateEndOfAttributes | Verifica se tutti gli attributi obbligatori nel contesto dell'elemento sono presenti e prepara l'oggetto XmlSchemaValidator per convalidare il contenuto figlio dell'elemento. |
| ValidateText | Convalida se il testo è consentito nel contesto dell'elemento corrente e accumula il testo per la convalida se l'elemento corrente ha contenuto semplice. |
| ValidateWhitespace | Convalida se lo spazio vuoto è consentito nel contesto dell'elemento corrente e accumula lo spazio vuoto per la convalida se l'elemento corrente ha contenuto semplice. |
| ValidateEndElement | Verifica se il contenuto di testo dell'elemento è valido in base al relativo tipo di dati per gli elementi con contenuto semplice e verifica se il contenuto dell'elemento corrente è completo per gli elementi con contenuto complesso. |
| SkipToEndElement | Ignora la convalida del contenuto dell'elemento corrente e prepara l'oggetto per convalidare il XmlSchemaValidator contenuto nel contesto dell'elemento padre. |
| EndValidation | Termina la convalida e controlla i vincoli identity per l'intero documento XML se è impostata l'opzione ProcessIdentityConstraints di convalida. |
Annotazioni
La XmlSchemaValidator classe ha una transizione di stato definita che applica la sequenza e l'occorrenza delle chiamate effettuate a ognuno dei metodi descritti nella tabella precedente. La transizione di stato specifica della XmlSchemaValidator classe è descritta nella sezione "XmlSchemaValidator State Transition" di questo argomento.
Per un esempio dei metodi usati per convalidare elementi, attributi e contenuto in un infoset XML, vedere l'esempio nella sezione precedente. Per altre informazioni su questi metodi, vedere la documentazione di riferimento sulla XmlSchemaValidator classe.
Convalida del contenuto tramite xmlValueGetter
XmlValueGetter
delegate Può essere usato per passare il valore di nodi attributo, testo o spazi vuoti come tipi CLR (Common Language Runtime) compatibili con il tipo XSD (XML Schema Definition Language) del nodo attributo, testo o spazio vuoto. È XmlValueGetterdelegate utile se il valore CLR di un attributo, testo o nodo di spazio bianco è già disponibile ed evita il costo di convertirlo in un oggetto string e analizzarlo nuovamente per la convalida.
I metodi ValidateAttribute, ValidateText e ValidateWhitespace sono sovraccaricati e accettano il valore di nodi attributo, testo o spazi vuoti come string o XmlValueGetterdelegate.
I metodi seguenti della XmlSchemaValidator classe accettano come XmlValueGetterdelegate parametro .
Di seguito è riportato un esempio XmlValueGetterdelegate tratto dall'esempio della classe XmlSchemaValidator nell'introduzione. Il XmlValueGetterdelegate restituisce il valore di un attributo come oggetto DateTime. Per convalidare questo DateTime oggetto restituito da XmlValueGetter, l'oggetto XmlSchemaValidator lo converte prima in ValueType (ValueType è il mapping CLR predefinito per il tipo XSD) per il tipo di dati dell'attributo e quindi controlla i facet sul valore convertito.
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);
}
Per un esempio completo di XmlValueGetterdelegate, vedere l'esempio nell'introduzione. Per ulteriori informazioni sui XmlValueGetterdelegate, consultare la documentazione di riferimento delle classi XmlValueGetter e XmlSchemaValidator.
Post-schema-Validation-Information
La classe XmlSchemaInfo rappresenta alcune proprietà del post-schemaValidation-Information di un nodo XML convalidato dalla classe XmlSchemaValidator. Vari metodi della XmlSchemaValidator classe accettano un XmlSchemaInfo oggetto come parametro facoltativo (null). out
Al termine della convalida, le proprietà dell'oggetto XmlSchemaInfo vengono impostate con i risultati della convalida. Ad esempio, al termine della convalida di un attributo usando il ValidateAttribute metodo , le XmlSchemaInfo proprietà , SchemaAttributeSchemaType, e MemberType dell'oggetto ( se specificato) Validityvengono impostate con i risultati della convalida.
I metodi di classe seguenti XmlSchemaValidator accettano un XmlSchemaInfo oggetto come parametro out.
Per un esempio completo della XmlSchemaInfo classe , vedere l'esempio nell'introduzione. Per altre informazioni sulla XmlSchemaInfo classe, vedere la documentazione di riferimento sulla XmlSchemaInfo classe.
Recupero di particelle attese, attributi e attributi predefiniti non specificati
La classe XmlSchemaValidator fornisce i metodi GetExpectedAttributes, GetExpectedParticles e GetUnspecifiedDefaultAttributes per recuperare le particelle attese, gli attributi e gli attributi predefiniti non specificati nel contesto di convalida corrente.
Recupero delle particelle previste
Il GetExpectedParticles metodo restituisce una matrice di XmlSchemaParticle oggetti contenenti le particelle previste nel contesto dell'elemento corrente. Le particelle valide che possono essere restituite dal GetExpectedParticles metodo sono istanze delle XmlSchemaElement classi e XmlSchemaAny .
Nel modello di contenuto, quando il compositor è di tipo xs:sequence, viene restituita solo la particella successiva nella sequenza. Se il compositore del modello di contenuto è un xs:all o un xs:choice, allora vengono restituite tutte le particelle valide che potrebbero seguire nel contesto dell'elemento corrente.
Annotazioni
Se il GetExpectedParticles metodo viene chiamato immediatamente dopo la chiamata al Initialize metodo , il GetExpectedParticles metodo restituisce tutti gli elementi globali.
Ad esempio, nello schema e nel documento XML che seguono, dopo la convalida dell'elemento book, l'elemento book diventa il contesto dell'elemento corrente. Il GetExpectedParticles metodo restituisce una matrice contenente un singolo XmlSchemaElement oggetto che rappresenta l'elemento title . Quando il contesto di convalida è l'elemento title , il GetExpectedParticles metodo restituisce una matrice vuota. Se il GetExpectedParticles metodo viene chiamato dopo la convalida dell'elemento title , ma prima che l'elemento description sia stato convalidato, restituisce una matrice contenente un singolo XmlSchemaElement oggetto che rappresenta l'elemento description . Se il metodo GetExpectedParticles viene chiamato dopo che l'elemento description è stato convalidato, restituisce un array contenente un singolo oggetto XmlSchemaAny che rappresenta il carattere jolly.
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'esempio accetta il codice XML seguente come input:
<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'esempio accetta lo schema XSD seguente come input:
<book>
<title>My Book</title>
<description>My Book's Description</description>
<namespace>System.Xml.Schema</namespace>
</book>
Annotazioni
I risultati dei GetExpectedParticlesmetodi , GetExpectedAttributese AddSchema della XmlSchemaValidator classe dipendono dal contesto corrente da convalidare. Per altre informazioni, vedere la sezione "Contesto di convalida" di questo argomento.
Per un esempio del GetExpectedParticles metodo , vedere l'esempio nell'introduzione. Per altre informazioni sul GetExpectedParticles metodo, vedere la documentazione di riferimento sulla XmlSchemaValidator classe.
Recupero degli attributi previsti
Il GetExpectedAttributes metodo restituisce una matrice di XmlSchemaAttribute oggetti contenente gli attributi previsti nel contesto dell'elemento corrente.
Ad esempio, nell'esempio dell'introduzione, il GetExpectedAttributes metodo viene usato per recuperare tutti gli attributi dell'elemento book .
Se si chiama il GetExpectedAttributes metodo immediatamente dopo il ValidateElement metodo , vengono restituiti tutti gli attributi che potrebbero essere visualizzati nel documento XML. Tuttavia, se si chiama il GetExpectedAttributes metodo dopo una o più chiamate al ValidateAttribute metodo, vengono restituiti gli attributi non ancora convalidati per l'elemento corrente.
Annotazioni
I risultati dei GetExpectedParticlesmetodi , GetExpectedAttributese AddSchema della XmlSchemaValidator classe dipendono dal contesto corrente da convalidare. Per altre informazioni, vedere la sezione "Contesto di convalida" di questo argomento.
Per un esempio del GetExpectedAttributes metodo , vedere l'esempio nell'introduzione. Per altre informazioni sul GetExpectedAttributes metodo, vedere la documentazione di riferimento sulla XmlSchemaValidator classe.
Recupero di attributi predefiniti non specificati
Il GetUnspecifiedDefaultAttributes metodo popola l'oggetto ArrayList specificato con XmlSchemaAttribute oggetti per tutti gli attributi con valori predefiniti che non sono stati convalidati in precedenza usando il ValidateAttribute metodo nel contesto dell'elemento. Il GetUnspecifiedDefaultAttributes metodo deve essere chiamato dopo aver chiamato il ValidateAttribute metodo su ogni attributo nel contesto dell'elemento. Il GetUnspecifiedDefaultAttributes metodo deve essere utilizzato per determinare quali attributi predefiniti devono essere inseriti nel documento XML da convalidare.
Per altre informazioni sul GetUnspecifiedDefaultAttributes metodo, vedere la documentazione di riferimento sulla XmlSchemaValidator classe.
Gestione degli eventi di convalida dello schema
Gli avvisi e gli errori di convalida dello schema rilevati durante la convalida vengono gestiti dall'evento ValidationEventHandler della XmlSchemaValidator classe .
Gli avvisi di convalida dello schema hanno un valore di XmlSeverityType e gli errori di convalida dello schema hanno un valore pari a Warning. Se non è stato assegnato alcun ValidationEventHandler, viene lanciato un XmlSchemaValidationException per tutti gli errori di convalida dello schema con un valore XmlSeverityType di Error. Tuttavia, non viene generata un'eccezione XmlSchemaValidationException per gli avvisi di convalida dello schema con il XmlSeverityType valore Warning.
Di seguito è riportato un esempio di che ValidationEventHandler riceve avvisi ed errori di convalida dello schema rilevati durante la convalida dello schema tratto dall'esempio nell'introduzione.
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;
}
}
Per un esempio completo di ValidationEventHandler, vedere l'esempio nell'introduzione. Per altre informazioni, vedere la documentazione di riferimento sulla XmlSchemaInfo classe.
Transizione di stato di XmlSchemaValidator
La XmlSchemaValidator classe ha una transizione di stato definita che applica la sequenza e l'occorrenza delle chiamate effettuate a ognuno dei metodi usati per convalidare elementi, attributi e contenuto in un infoset XML.
La tabella seguente descrive la transizione di stato della XmlSchemaValidator classe e la sequenza e l'occorrenza delle chiamate al metodo che possono essere effettuate in ogni stato.
| stato | Transizione |
|---|---|
| Convalidare | Initialize (ValidateAttribute | TopLevel*) EndValidation |
| TopLevel | ValidateWhitespace | ValidateText | Elemento |
| Elemento |
ValidateElement
ValidateAttribute* (ValidateEndOfAttributes Contenuto*)? ValidateEndElement | ValidateElement ValidateAttribute * SkipToEndElement | ValidateElement ValidateAttribute * ValidateEndOfAttributes Contenuto* SkipToEndElement | |
| Contenuto | ValidateWhitespace | ValidateText | Elemento |
Annotazioni
Un InvalidOperationException oggetto viene generato da ognuno dei metodi nella tabella precedente quando la chiamata al metodo viene eseguita nella sequenza non corretta in base allo stato corrente di un XmlSchemaValidator oggetto.
La tabella di transizione dello stato precedente usa i simboli di punteggiatura per descrivere i metodi e altri stati che possono essere chiamati per ogni stato della transizione di stato della XmlSchemaValidator classe. I simboli usati sono gli stessi simboli disponibili nelle informazioni di riferimento sugli standard XML per la definizione DTD (Document Type Definition).
Nella tabella seguente viene descritto il modo in cui i simboli di punteggiatura trovati nella tabella di transizione di stato precedente influiscono sui metodi e sugli altri stati che possono essere chiamati per ogni stato nella transizione di stato della XmlSchemaValidator classe .
| Simbolo | Descrizione |
|---|---|
| | | È possibile chiamare il metodo o lo stato (quello prima della barra o dopo di esso). |
| ? | Il metodo o lo stato che precede il punto interrogativo è facoltativo, ma se viene chiamato può essere chiamato una sola volta. |
| * | Il metodo o lo stato che precede il simbolo * è facoltativo e può essere chiamato più volte. |
Contesto di convalida
I metodi della XmlSchemaValidator classe utilizzata per convalidare elementi, attributi e contenuto in un infoset XML modificano il contesto di convalida di un XmlSchemaValidator oggetto. Ad esempio, il metodo SkipToEndElement ignora la convalida del contenuto dell'elemento corrente e prepara l'oggetto per convalidare il contenuto nel contesto dell'elemento padre; equivale a ignorare la convalida per tutti gli elementi figlio dell'elemento corrente e quindi chiamare il metodo XmlSchemaValidator.
I risultati dei GetExpectedParticlesmetodi , GetExpectedAttributese AddSchema della XmlSchemaValidator classe dipendono dal contesto corrente da convalidare.
Nella tabella seguente vengono descritti i risultati della chiamata di questi metodi dopo aver chiamato uno dei metodi della XmlSchemaValidator classe utilizzata per convalidare elementi, attributi e contenuto in un infoset XML.
| Metodo | GetExpectedParticles | GetExpectedAttributes | AddSchema |
|---|---|---|---|
| Initialize | Se viene chiamato il metodo predefinito Initialize , GetExpectedParticles restituisce una matrice contenente tutti gli elementi globali. Se il metodo overload Initialize che accetta un XmlSchemaObject come parametro viene chiamato per inizializzare la convalida parziale di un elemento, GetExpectedParticles restituisce solo l'elemento a cui è stato inizializzato l'oggetto XmlSchemaValidator. |
Se viene chiamato il metodo predefinito Initialize , GetExpectedAttributes restituisce una matrice vuota. Se il sovraccarico del metodo Initialize che prende un XmlSchemaObject come parametro è chiamato per inizializzare la convalida parziale di un attributo, GetExpectedAttributes restituisce solo l'attributo a cui l'oggetto XmlSchemaValidator è stato inizializzato. |
Aggiunge lo schema all'oggetto XmlSchemaSet dell'oggetto XmlSchemaValidator se non presenta errori di pre-elaborazione. |
| ValidateElement | Se l'elemento di contesto è valido, GetExpectedParticles restituisce la sequenza di elementi previsti come elementi figlio dell'elemento di contesto. Se l'elemento di contesto non è valido, GetExpectedParticles restituisce una matrice vuota. |
Se l'elemento di contesto è valido e se non è stata eseguita alcuna chiamata a ValidateAttribute , GetExpectedAttributes restituisce un elenco di tutti gli attributi definiti nell'elemento di contesto. Se alcuni attributi sono già stati convalidati, GetExpectedAttributes restituisce un elenco degli attributi rimanenti da convalidare. Se l'elemento di contesto non è valido, GetExpectedAttributes restituisce una matrice vuota. |
Come sopra. |
| ValidateAttribute | Se l'attributo context è un attributo di primo livello, GetExpectedParticles restituisce una matrice vuota. In caso contrario GetExpectedParticles , restituisce la sequenza di elementi previsti come primo elemento figlio dell'elemento di contesto. |
Se l'attributo context è un attributo di primo livello, GetExpectedAttributes restituisce una matrice vuota. In caso contrario GetExpectedAttributes , restituisce l'elenco degli attributi rimanenti da convalidare. |
Come sopra. |
| GetUnspecifiedDefaultAttributes | GetExpectedParticles restituisce la sequenza di elementi previsti come primo elemento figlio dell'elemento di contesto. | GetExpectedAttributes restituisce un elenco degli attributi obbligatori e facoltativi ancora da convalidare per l'elemento di contesto. | Come sopra. |
| ValidateEndOfAttributes | GetExpectedParticles restituisce la sequenza di elementi previsti come primo elemento figlio dell'elemento di contesto. | GetExpectedAttributes restituisce una matrice vuota. | Come sopra. |
| ValidateText | Se il contentType dell'elemento di contesto è Mixed, GetExpectedParticles restituisce la sequenza di elementi previsti nella posizione successiva. Se contentType dell'elemento di contesto è TextOnly o Empty, GetExpectedParticles restituisce una matrice vuota. Se il contentType dell'elemento di contesto è ElementOnly, GetExpectedParticles restituisce la sequenza di elementi previsti nella posizione successiva, ma si è già verificato un errore di convalida. |
GetExpectedAttributes restituisce l'elenco di attributi dell'elemento di contesto non convalidati. | Come sopra. |
| ValidateWhitespace | Se lo spazio vuoto del contesto è uno spazio vuoto di primo livello, GetExpectedParticles restituisce una matrice vuota. Altrimenti, il comportamento del metodo GetExpectedParticles è lo stesso come in ValidateText. |
Se lo spazio vuoto del contesto è uno spazio vuoto di primo livello, GetExpectedAttributes restituisce una matrice vuota. Altrimenti, il comportamento del metodo GetExpectedAttributes è lo stesso come in ValidateText. |
Come sopra. |
| ValidateEndElement | GetExpectedParticles restituisce la sequenza di elementi previsti dopo l'elemento di contesto (possibili elementi di pari livello). |
GetExpectedAttributes restituisce l'elenco di attributi dell'elemento di contesto non convalidati. Se l'elemento di contesto non ha un elemento padre, GetExpectedAttributes restituisce un elenco vuoto (l'elemento di contesto è l'elemento padre dell'elemento corrente in cui ValidateEndElement è stato chiamato). |
Come sopra. |
| SkipToEndElement | Uguale a ValidateEndElement. | Uguale a ValidateEndElement. | Come sopra. |
| EndValidation | Restituisce una matrice vuota. | Restituisce una matrice vuota. | Come sopra. |
Annotazioni
I valori restituiti dalle varie proprietà della XmlSchemaValidator classe non vengono modificati chiamando uno dei metodi nella tabella precedente.