Condividi tramite


Convalida basata sul metodo push di XmlSchemaValidator

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.

Vedere anche