Compartir a través de


Validación de XmlSchemaValidator Push-Based

La XmlSchemaValidator clase proporciona un mecanismo eficaz y de alto rendimiento para validar los datos XML contra esquemas XML de manera push. Por ejemplo, la XmlSchemaValidator clase permite validar un conjunto de información XML en contexto sin tener que serializarlo como un documento XML y, a continuación, volver a analizar el documento mediante un lector XML de validación.

La XmlSchemaValidator clase se puede usar en escenarios avanzados, como la creación de motores de validación a través de orígenes de datos XML personalizados o como una manera de crear un escritor XML de validación.

A continuación se muestra un ejemplo del uso de la clase XmlSchemaValidator para validar el archivo contosoBooks.xml contra el esquema contosoBooks.xsd. En el ejemplo se usa la XmlSerializer clase para deserializar el contosoBooks.xml archivo y pasar el valor de los nodos a los métodos de la XmlSchemaValidator clase .

Nota:

Este ejemplo se usa en las secciones de este tema.

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

En el ejemplo se toma el archivo contosoBooks.xml como entrada.

<?xml version="1.0" encoding="utf-8" ?>
<bookstore xmlns="http://www.contoso.com/books">
    <book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
        <title>The Autobiography of Benjamin Franklin</title>
        <author>
            <first-name>Benjamin</first-name>
            <last-name>Franklin</last-name>
        </author>
        <price>8.99</price>
    </book>
    <book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
        <title>The Confidence Man</title>
        <author>
            <first-name>Herman</first-name>
            <last-name>Melville</last-name>
        </author>
        <price>11.99</price>
    </book>
    <book genre="philosophy" publicationdate="1991-02-15" ISBN="1-861001-57-6">
        <title>The Gorgias</title>
        <author>
            <name>Plato</name>
        </author>
        <price>9.99</price>
    </book>
</bookstore>

El ejemplo también toma el contosoBooks.xsd como entrada.

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.contoso.com/books" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="bookstore">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" name="book">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="title" type="xs:string" />
                            <xs:element name="author">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element minOccurs="0" name="name" type="xs:string" />
                                        <xs:element minOccurs="0" name="first-name" type="xs:string" />
                                        <xs:element minOccurs="0" name="last-name" type="xs:string" />
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="price" type="xs:decimal" />
                        </xs:sequence>
                        <xs:attribute name="genre" type="xs:string" use="required" />
                        <xs:attribute name="publicationdate" type="xs:date" use="required" />
                        <xs:attribute name="ISBN" type="xs:string" use="required" />
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Validación de datos XML mediante XmlSchemaValidator

Para empezar a validar un conjunto de información XML, primero debe inicializar una nueva instancia de la XmlSchemaValidator clase mediante el XmlSchemaValidator constructor .

El XmlSchemaValidator constructor toma XmlNameTablelos objetos , XmlSchemaSety XmlNamespaceManager como parámetros, así como un XmlSchemaValidationFlags valor como parámetro. El objeto XmlNameTable se utiliza para atomizar cadenas bien conocidas de espacios de nombres, como el espacio de nombres de esquema, el espacio de nombres XML, etc., y se pasa al método ParseValue mientras se valida contenido simple. El XmlSchemaSet objeto contiene los esquemas XML usados para validar el conjunto de información XML. El XmlNamespaceManager objeto se usa para resolver los espacios de nombres encontrados durante la validación. El XmlSchemaValidationFlags valor se usa para deshabilitar determinadas características de validación.

Para obtener más información sobre el XmlSchemaValidator constructor, consulte la documentación de referencia de clases XmlSchemaValidator .

Inicialización de la validación

Después de construir un XmlSchemaValidator objeto, hay dos métodos sobrecargados Initialize que se usan para inicializar el estado del XmlSchemaValidator objeto. A continuación se muestran los dos Initialize métodos.

El método predeterminado XmlSchemaValidator.Initialize inicializa un XmlSchemaValidator objeto en su estado inicial y el método sobrecargado XmlSchemaValidator.Initialize que toma XmlSchemaObject como parámetro inicializa un XmlSchemaValidator objeto en su estado inicial para la validación parcial.

Solo se puede llamar a ambos Initialize métodos inmediatamente después de construir un XmlSchemaValidator objeto o después de una llamada a EndValidation.

Para obtener un ejemplo del XmlSchemaValidator.Initialize método , vea el ejemplo de la introducción. Para obtener más información sobre el Initialize método, consulte la documentación de referencia de clases XmlSchemaValidator .

Validación parcial

El XmlSchemaValidator.Initialize método que toma XmlSchemaObject como parámetro inicializa un XmlSchemaValidator objeto en su estado inicial para la validación parcial.

En el siguiente ejemplo, se inicializa un XmlSchemaObject para la validación parcial utilizando el método XmlSchemaValidator.Initialize. Para pasar el elemento de esquema orderNumber, se selecciona por XmlQualifiedName en la colección XmlSchemaObjectTable que devuelve la propiedad GlobalElements del objeto XmlSchemaSet. A continuación, el XmlSchemaValidator objeto valida este elemento específico.

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);

En el ejemplo se toma el siguiente esquema XML como entrada.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="orderNumber" type="xs:int" />
</xs:schema>

Para obtener más información sobre el Initialize método, consulte la documentación de referencia de clases XmlSchemaValidator .

Agregar esquemas adicionales

El AddSchema método de la XmlSchemaValidator clase se usa para agregar un esquema XML al conjunto de esquemas usados durante la validación. El AddSchema método se puede usar para simular el efecto de encontrar un esquema XML insertado en el conjunto de información XML que se está validando.

Nota:

El espacio de nombres de destino del XmlSchema parámetro no puede coincidir con el de ningún elemento o atributo ya encontrado por el XmlSchemaValidator objeto .

Si el XmlSchemaValidationFlags.ProcessInlineSchema valor no se pasó como parámetro al XmlSchemaValidator constructor, el AddSchema método no hace nada.

El resultado del AddSchema método depende del contexto de nodo XML actual que se valida. Para obtener más información sobre los contextos de validación, vea la sección "Contexto de validación" de este tema.

Para obtener más información sobre el AddSchema método, consulte la documentación de referencia de clases XmlSchemaValidator .

Validar elementos, atributos y contenido

La XmlSchemaValidator clase proporciona varios métodos usados para validar elementos, atributos y contenido en un conjunto de información XML con esquemas XML. En la tabla siguiente se describe cada uno de estos métodos.

Método Descripción
ValidateElement Valida el nombre del elemento en el contexto actual.
ValidateAttribute Valida el atributo en el contexto del elemento actual o con el objeto XmlSchemaAttribute que se pasa como parámetro al método Initialize.
ValidateEndOfAttributes Comprueba si todos los atributos necesarios del contexto de elemento están presentes y prepara el XmlSchemaValidator objeto para validar el contenido secundario del elemento.
ValidateText Valida si se permite texto en el contexto del elemento actual y acumula el texto para la validación si el elemento actual tiene contenido simple.
ValidateWhitespace Valida si se permite el espacio en blanco en el contexto del elemento actual y acumula el espacio en blanco para validar si el elemento actual tiene contenido simple.
ValidateEndElement Comprueba si el contenido de texto del elemento es válido según su tipo de datos para los elementos con contenido simple y comprueba si el contenido del elemento actual está completo para los elementos con contenido complejo.
SkipToEndElement Omite la validación del contenido del elemento actual y prepara el objeto para validar el XmlSchemaValidator contenido en el contexto del elemento primario.
EndValidation Finaliza la validación y comprueba las restricciones de identidad para todo el documento XML si se establece la ProcessIdentityConstraints opción de validación.

Nota:

La XmlSchemaValidator clase tiene una transición de estado definida que impone la secuencia y la ocurrencia de las llamadas realizadas a cada uno de los métodos descritos en la tabla anterior. La transición de estado específica de la XmlSchemaValidator clase se describe en la sección "Transición de estado xmlSchemaValidator" de este tema.

Para obtener un ejemplo de los métodos usados para validar elementos, atributos y contenido en un conjunto de información XML, vea el ejemplo de la sección anterior. Para obtener más información sobre estos métodos, consulte la documentación de referencia de clases XmlSchemaValidator .

Validación de contenido mediante xmlValueGetter

XmlValueGetter delegate se puede utilizar para pasar el valor de los nodos de atributos, textos o espacios en blanco como tipos Common Language Runtime (CLR) compatibles con el tipo del lenguaje de definición de esquema XML (XSD) del nodo de atributos, textos o espacios en blanco. XmlValueGetter delegate es útil si el valor CLR de un nodo de atributos, textos o espacios en blanco ya está disponible y evita el costo de convertirlo en un valor string y luego volver a analizarlo para validarlo.

Los ValidateAttribute, ValidateText y ValidateWhitespace métodos se sobrecargan y aceptan el valor de los nodos de atributo, texto o espacio en blanco como un string o XmlValueGetterdelegate.

Los siguientes métodos de la clase XmlSchemaValidator aceptan un XmlValueGetterdelegate como parámetro.

A continuación, se ofrece un ejemplo de un XmlValueGetterdelegate tomado del ejemplo de la clase XmlSchemaValidator de la introducción. XmlValueGetter delegate devuelve el valor de un atributo como un DateTime objeto . Para validar este DateTime objeto devuelto por XmlValueGetter, el XmlSchemaValidator objeto lo convierte primero en ValueType (ValueType es la asignación CLR predeterminada para el tipo XSD) para el tipo de datos del atributo y, a continuación, comprueba las facetas en el valor convertido.

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);
}

Para obtener un ejemplo completo de XmlValueGetterdelegate, vea el ejemplo de la introducción. Para obtener más información sobre XmlValueGetterdelegate, vea la documentación de referencia de las clases XmlValueGetter y XmlSchemaValidator.

Información posterior a la validación del esquema

La clase XmlSchemaInfo representa parte del post-esquemaValidation-Information de un nodo XML validado por la clase XmlSchemaValidator. Varios métodos de la XmlSchemaValidator clase aceptan un XmlSchemaInfo objeto como parámetro opcional (null ). out

Tras la validación correcta, las propiedades del XmlSchemaInfo objeto se establecen con los resultados de la validación. Por ejemplo, tras la validación correcta de un atributo mediante el método ValidateAttribute, las propiedades XmlSchemaInfo, SchemaAttribute, SchemaType, y MemberType del objeto Validity se establecen con los resultados de la validación.

Los métodos de clase siguientes XmlSchemaValidator aceptan un XmlSchemaInfo objeto como parámetro out.

Para obtener un ejemplo completo de la XmlSchemaInfo clase , vea el ejemplo de la introducción. Para obtener más información sobre la XmlSchemaInfo clase, consulte la documentación de referencia de clases XmlSchemaInfo .

Recuperación de partículas y atributos esperados y atributos predeterminados no especificados

La XmlSchemaValidator clase proporciona los GetExpectedAttributesmétodos , GetExpectedParticlesy GetUnspecifiedDefaultAttributes para recuperar las partículas, atributos y atributos predeterminados no especificados esperados en el contexto de validación actual.

Recuperación de partículas esperadas

El GetExpectedParticles método devuelve una matriz de XmlSchemaParticle objetos que contienen las partículas esperadas en el contexto del elemento actual. Las partículas válidas que el método puede devolver GetExpectedParticles son instancias de las XmlSchemaElement clases y XmlSchemaAny .

Cuando el compositor del modelo de contenido es xs:sequence, solo se devuelve la siguiente partícula de la secuencia. Si el compositor del modelo de contenido es un xs:all o un xs:choice, se devuelven todas las partículas válidas que podrían seguir en el contexto del elemento actual.

Nota:

Si se llama al GetExpectedParticles método inmediatamente después de llamar al Initialize método , el GetExpectedParticles método devuelve todos los elementos globales.

Por ejemplo, en el esquema del lenguaje de definición de esquemas XML (XSD) y en el documento XML que sigue, después de validar el book elemento, el book elemento es el contexto del elemento actual. El GetExpectedParticles método devuelve una matriz que contiene un único XmlSchemaElement objeto que representa el title elemento . Cuando el contexto de validación es el title elemento , el GetExpectedParticles método devuelve una matriz vacía. Si se llama al GetExpectedParticles método después de validar el title elemento, pero antes de que se haya validado el description elemento, devuelve una matriz que contiene un único XmlSchemaElement objeto que representa el description elemento. Si se llama al GetExpectedParticles método después de validar el description elemento, devuelve una matriz que contiene un único XmlSchemaAny objeto que representa el carácter comodín.

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);

En el ejemplo se toma el siguiente XML como entrada:

<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>

En el ejemplo se toma el siguiente esquema XSD como entrada:

<book>
  <title>My Book</title>
  <description>My Book's Description</description>
  <namespace>System.Xml.Schema</namespace>
</book>

Nota:

Los resultados de los GetExpectedParticlesmétodos , GetExpectedAttributesy AddSchema de la XmlSchemaValidator clase dependen del contexto actual que se valida. Para obtener más información, vea la sección "Contexto de validación" de este tema.

Para obtener un ejemplo del GetExpectedParticles método , vea el ejemplo de la introducción. Para obtener más información sobre el GetExpectedParticles método, consulte la documentación de referencia de clases XmlSchemaValidator .

Recuperación de atributos esperados

El GetExpectedAttributes método devuelve una matriz de XmlSchemaAttribute objetos que contiene los atributos esperados en el contexto del elemento actual.

Por ejemplo, en el ejemplo de la introducción, el GetExpectedAttributes método se usa para recuperar todos los atributos del book elemento.

Si llama al GetExpectedAttributes método inmediatamente después del ValidateElement método , se devuelven todos los atributos que podrían aparecer en el documento XML. Sin embargo, si llama al GetExpectedAttributes método después de una o varias llamadas al ValidateAttribute método , se devuelven los atributos que aún no se han validado para el elemento actual.

Nota:

Los resultados de los GetExpectedParticlesmétodos , GetExpectedAttributesy AddSchema de la XmlSchemaValidator clase dependen del contexto actual que se valida. Para obtener más información, vea la sección "Contexto de validación" de este tema.

Para obtener un ejemplo del GetExpectedAttributes método , vea el ejemplo de la introducción. Para obtener más información sobre el GetExpectedAttributes método, consulte la documentación de referencia de clases XmlSchemaValidator .

Recuperación de atributos predeterminados no especificados

El método GetUnspecifiedDefaultAttributes rellena el ArrayList, que se especifica, con XmlSchemaAttribute objetos para los atributos con valores predeterminados que no se han validado previamente mediante el método ValidateAttribute en el contexto del elemento. El método GetUnspecifiedDefaultAttributes se debería llamar después de llamar al método ValidateAttribute en cada atributo del contexto del elemento. El GetUnspecifiedDefaultAttributes método debe usarse para determinar qué atributos predeterminados se van a insertar en el documento XML que se va a validar.

Para obtener más información sobre el GetUnspecifiedDefaultAttributes método, consulte la documentación de referencia de clases XmlSchemaValidator .

Control de eventos de validación de esquema

Las advertencias y errores de validación de esquemas detectados durante la validación se controlan mediante el ValidationEventHandler evento de la XmlSchemaValidator clase .

Las advertencias de validación de esquemas tienen un valor XmlSeverityType de Warning y los errores de validación de esquemas tienen un valor XmlSeverityType de Error. Si no se ha asignado ningún ValidationEventHandler, se inicia una XmlSchemaValidationException para todos los errores de validación de esquemas con un valor XmlSeverityType de Error. Sin embargo, no se inicia una XmlSchemaValidationException para las advertencias de validación de esquemas con un valor XmlSeverityType de Warning.

A continuación se muestra un ejemplo de que ValidationEventHandler recibe advertencias de validación de esquema y errores detectados durante la validación de esquema tomada del ejemplo de la introducción.

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;
    }
}

Para obtener un ejemplo completo de ValidationEventHandler, vea el ejemplo de la introducción. Para más información, consulte la documentación de referencia de la clase XmlSchemaInfo.

Transición de estado de XmlSchemaValidator

La XmlSchemaValidator clase tiene una transición de estado definida que aplica la secuencia y repetición de llamadas realizadas a cada uno de los métodos usados para validar elementos, atributos y contenido en un conjunto de información XML.

En la tabla siguiente se describe la transición de estado de la XmlSchemaValidator clase y la secuencia y repetición de llamadas de método que se pueden realizar en cada estado.

Estado Transición
Validación Initialize (ValidateAttribute | TopLevel*) EndValidation
TopLevel ValidateWhitespace | ValidateText | Elemento
Elemento ValidateElement ValidateAttribute* (ValidateEndOfAttributes Contenido*)? ValidateEndElement |

ValidateElement ValidateAttribute * SkipToEndElement |

ValidateElement ValidateAttribute * ValidateEndOfAttributes Contenido* SkipToEndElement |
Contenido ValidateWhitespace | ValidateText | Elemento

Nota:

Cada uno de los métodos de la tabla anterior inicia una InvalidOperationException cuando se realiza la llamada al método en la secuencia incorrecta de acuerdo con el estado actual de un objeto XmlSchemaValidator.

La tabla de transición de estado anterior usa símbolos de puntuación para describir los métodos y otros estados a los que se puede llamar para cada estado de la transición de estado de la XmlSchemaValidator clase. Los símbolos usados son los mismos símbolos que se encuentran en la referencia de estándares XML para la definición de tipo de documento (DTD).

En la tabla siguiente se describe cómo afectan los símbolos de puntuación que se encuentran en la tabla de transición de estado anterior a los métodos y otros estados a los que se puede llamar para cada estado de la transición de estado de la XmlSchemaValidator clase.

Símbolo Descripción
| Se puede llamar al método o al estado (al que está antes o después de la barra).
? El método o el estado que precede al signo de interrogación es opcional, pero si se llama solo se puede llamar una vez.
* El método o el estado que precede al símbolo * es opcional y puede ser llamado más de una vez.

Contexto de validación

Los métodos de la XmlSchemaValidator clase que se usan para validar elementos, atributos y contenido en un conjunto de información XML, cambian el contexto de validación de un XmlSchemaValidator objeto. Por ejemplo, el método SkipToEndElement omite la validación del contenido del elemento actual y prepara el objeto XmlSchemaValidator para validar contenido en el contexto del elemento primario; es equivalente a la omisión de la validación para todos los elementos secundarios del elemento actual y luego a la llamada del método ValidateEndElement.

Los resultados de los GetExpectedParticlesmétodos , GetExpectedAttributesy AddSchema de la XmlSchemaValidator clase dependen del contexto actual que se valida.

En la tabla siguiente se describen los resultados de llamar a estos métodos después de llamar a uno de los métodos de la XmlSchemaValidator clase que se usan para validar elementos, atributos y contenido en un conjunto de información XML.

Método GetExpectedParticles ObtenerAtributosEsperados AñadirEsquema
Initialize Si se llama al método predeterminado Initialize , GetExpectedParticles devuelve una matriz que contiene todos los elementos globales.

Si se llama al método sobrecargado Initialize que toma como XmlSchemaObject parámetro para inicializar la validación parcial de un elemento, GetExpectedParticles devuelve solo el elemento al que se inicializó el XmlSchemaValidator objeto.
Si se llama al método predeterminado Initialize , GetExpectedAttributes devuelve una matriz vacía.

Si se llama a la sobrecarga del método Initialize que toma un XmlSchemaObject como parámetro para inicializar la validación parcial de un atributo, GetExpectedAttributes devuelve solo el atributo en el cual se ha inicializado el objeto XmlSchemaValidator.
Agrega el esquema al XmlSchemaSet del XmlSchemaValidator objeto si no tiene errores de preprocesamiento.
ValidateElement Si el elemento de contexto es válido, GetExpectedParticles devuelve la secuencia de elementos esperados como elementos secundarios del elemento de contexto.

Si el elemento de contexto no es válido, GetExpectedParticles devuelve una matriz vacía.
Si el elemento de contexto es válido y si no se ha realizado ninguna llamada a ValidateAttribute , GetExpectedAttributes devuelve una lista de todos los atributos definidos en el elemento de contexto.

Si ya se han validado algunos atributos, GetExpectedAttributes devuelve una lista de los atributos restantes que se van a validar.

Si el elemento de contexto no es válido, GetExpectedAttributes devuelve una matriz vacía.
Igual que antes.
ValidateAttribute Si el atributo de contexto es un atributo de nivel superior, GetExpectedParticles devuelve una matriz vacía.

De lo contrario, GetExpectedParticles devuelve la secuencia de elementos esperados como primer hijo del elemento de contexto.
Si el atributo de contexto es un atributo de nivel superior, GetExpectedAttributes devuelve una matriz vacía.

De lo contrario, GetExpectedAttributes devuelve la lista de atributos restantes que se van a validar.
Igual que antes.
GetUnspecifiedDefaultAttributes GetExpectedParticles devuelve la secuencia de elementos previstos como primer hijo del elemento de contexto. GetExpectedAttributes devuelve una lista de los atributos obligatorios y opcionales que todavía se van a validar para el elemento de contexto. Igual que antes.
ValidateEndOfAttributes GetExpectedParticles devuelve la secuencia de elementos previstos como primer hijo del elemento de contexto. GetExpectedAttributes devuelve una matriz vacía. Igual que antes.
ValidateText Si contentType del elemento de contexto es Mixed, GetExpectedParticles devuelve la secuencia de elementos esperados en la siguiente posición.

Si el contentType del elemento de contexto es TextOnly o Empty, GetExpectedParticles devuelve una matriz vacía.

Si el contentType del elemento de contexto es ElementOnly, GetExpectedParticles devuelve la secuencia de elementos esperados en la siguiente posición, pero ya se ha producido un error de validación.
GetExpectedAttributes devuelve la lista de atributos del elemento de contexto no validado. Igual que antes.
ValidateWhitespace Si el espacio en blanco del contexto es espacio en blanco de nivel superior, GetExpectedParticles devuelve una matriz vacía.

De lo contrario, el GetExpectedParticles comportamiento del método es el mismo que en ValidateText.
Si el espacio en blanco del contexto es espacio en blanco de nivel superior, GetExpectedAttributes devuelve una matriz vacía.

De lo contrario, el GetExpectedAttributes comportamiento del método es el mismo que en ValidateText.
Igual que antes.
ValidateEndElement GetExpectedParticles devuelve la secuencia de elementos esperados después del elemento de contexto (posibles elementos del mismo nivel). GetExpectedAttributes devuelve la lista de atributos del elemento de contexto no validado.

Si el elemento de contexto no tiene ningún elemento primario, GetExpectedAttributes devuelve una lista vacía (el elemento de contexto es el elemento primario del elemento actual en el que ValidateEndElement se llamó).
Igual que antes.
SkipToEndElement Igual a ValidateEndElement. Igual a ValidateEndElement. Igual que antes.
EndValidation Devuelve una matriz vacía. Devuelve una matriz vacía. Igual que antes.

Nota:

Los valores devueltos por las distintas propiedades de la XmlSchemaValidator clase no se modifican llamando a ninguno de los métodos de la tabla anterior.

Consulte también