Udostępnij za pośrednictwem


Weryfikacja oparta na wypchnięciach przy użyciu klasy XmlSchemaValidator

Klasa XmlSchemaValidator zapewnia wydajny mechanizm wysokiej wydajności do weryfikowania danych XML względem schematów XML w sposób wypychany. Na przykład XmlSchemaValidator klasa umożliwia zweryfikowanie zestawu informacji XML w miejscu bez konieczności serializacji go jako dokumentu XML, a następnie ponownej analizy dokumentu przy użyciu czytnika xml.

Klasa XmlSchemaValidator może być używana w zaawansowanych scenariuszach, takich jak kompilowanie aparatów sprawdzania poprawności za pośrednictwem niestandardowych źródeł danych XML lub jako sposób tworzenia modułu zapisywania walidacji XML.

Poniżej przedstawiono przykład użycia XmlSchemaValidator klasy w celu zweryfikowania contosoBooks.xml pliku względem schematu contosoBooks.xsd . W przykładzie XmlSerializer użyto klasy do deserializacji contosoBooks.xml pliku i przekazania wartości węzłów do metod XmlSchemaValidator klasy.

Uwaga

Ten przykład jest używany w sekcjach tego tematu.

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: '{0}'", 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 '{0}' with type '{1}' is '{2}'",
                    schemaInfo.SchemaElement.Name, schemaInfo.SchemaType, schemaInfo.Validity);
            }
            else if (schemaInfo.SchemaAttribute != null)
            {
                Console.WriteLine("Attribute '{0}' with type '{1}' is '{2}'",
                    schemaInfo.SchemaAttribute.Name, schemaInfo.SchemaType, schemaInfo.Validity);
            }
        }

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

    [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

W przykładzie plik jest pobierany contosoBooks.xml jako dane wejściowe.

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

Przykład przyjmuje contosoBooks.xsd również jako dane wejściowe.

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

Weryfikowanie danych XML przy użyciu klasy XmlSchemaValidator

Aby rozpocząć walidację zestawu informacji XML, należy najpierw zainicjować nowe wystąpienie XmlSchemaValidator klasy przy użyciu konstruktora XmlSchemaValidator .

Konstruktor XmlSchemaValidator przyjmuje XmlNameTableobiekty , XmlSchemaSeti XmlNamespaceManager oraz parametry, a także XmlSchemaValidationFlags wartość jako parametr. Obiekt XmlNameTable jest używany do atomizowania dobrze znanych ciągów przestrzeni nazw, takich jak przestrzeń nazw schematu, przestrzeń nazw XML itd., i jest przekazywany do ParseValue metody podczas walidacji prostej zawartości. Obiekt XmlSchemaSet zawiera schematy XML używane do weryfikowania zestawu informacji XML. Obiekt jest używany do rozpoznawania XmlNamespaceManager przestrzeni nazw napotkanych podczas walidacji. Wartość XmlSchemaValidationFlags jest używana do wyłączania niektórych funkcji walidacji.

Aby uzyskać więcej informacji na temat konstruktora XmlSchemaValidator , zobacz dokumentację referencyjną XmlSchemaValidator klas.

Inicjowanie walidacji

Po skonstruowaniu XmlSchemaValidator obiektu istnieją dwie przeciążone Initialize metody służące do inicjowania stanu XmlSchemaValidator obiektu. Poniżej przedstawiono dwie Initialize metody.

Metoda domyślna XmlSchemaValidator.Initialize inicjuje XmlSchemaValidator obiekt do stanu początkowego, a przeciążona XmlSchemaValidator.Initialize metoda, która przyjmuje XmlSchemaObject jako parametr inicjuje XmlSchemaValidator obiekt w stanie początkowym na potrzeby częściowej walidacji.

Obie Initialize metody mogą być wywoływane tylko natychmiast po skonstruowaniu XmlSchemaValidator obiektu lub po wywołaniu metody EndValidation.

Aby zapoznać się z przykładem XmlSchemaValidator.Initialize metody, zobacz przykład z wprowadzenia. Aby uzyskać więcej informacji na temat metody, zobacz dokumentację referencyjną Initialize XmlSchemaValidator klas.

Częściowa walidacja

Metoda XmlSchemaValidator.Initialize , która przyjmuje XmlSchemaObject jako parametr inicjuje obiekt do stanu początkowego XmlSchemaValidator na potrzeby częściowej weryfikacji.

W poniższym przykładzie element XmlSchemaObject jest inicjowany na potrzeby częściowej weryfikacji przy użyciu XmlSchemaValidator.Initialize metody . Element orderNumber schematu jest przekazywany przez wybranie elementu XmlQualifiedName schematu w XmlSchemaObjectTable kolekcji zwróconej przez GlobalElements właściwość XmlSchemaSet obiektu. Następnie XmlSchemaValidator obiekt weryfikuje ten konkretny element.

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

W przykładzie jako dane wejściowe przyjmuje następujący schemat XML.

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

Aby uzyskać więcej informacji na temat metody, zobacz dokumentację referencyjną Initialize XmlSchemaValidator klas.

Dodawanie dodatkowych schematów

Metoda AddSchema XmlSchemaValidator klasy służy do dodawania schematu XML do zestawu schematów używanych podczas walidacji. Metoda AddSchema może służyć do symulowania wpływu napotkania wbudowanego schematu XML w weryfikowanym zestawie informacji XML.

Uwaga

Docelowa przestrzeń nazw parametru XmlSchema nie może być zgodna z żadnym elementem lub atrybutem XmlSchemaValidator , który już napotkał obiekt.

XmlSchemaValidationFlags.ProcessInlineSchema Jeśli wartość nie została przekazana jako parametr do konstruktoraXmlSchemaValidator, AddSchema metoda nic nie robi.

Wynik AddSchema metody jest zależny od weryfikowanego kontekstu bieżącego węzła XML. Aby uzyskać więcej informacji na temat kontekstów weryfikacji, zobacz sekcję "Kontekst weryfikacji" w tym temacie.

Aby uzyskać więcej informacji na temat metody, zobacz dokumentację referencyjną AddSchema XmlSchemaValidator klas.

Weryfikowanie elementów, atrybutów i zawartości

Klasa XmlSchemaValidator udostępnia kilka metod służących do weryfikowania elementów, atrybutów i zawartości w zestawie informacji XML względem schematów XML. W poniższej tabeli opisano każdą z tych metod.

Metoda opis
ValidateElement Weryfikuje nazwę elementu w bieżącym kontekście.
ValidateAttribute Sprawdza poprawność atrybutu w bieżącym kontekście elementu lub względem XmlSchemaAttribute obiektu przekazanego jako parametr metody Initialize .
ValidateEndOfAttributes Sprawdza, czy wszystkie wymagane atrybuty w kontekście elementu są obecne i przygotowuje XmlSchemaValidator obiekt do zweryfikowania zawartości podrzędnej elementu.
ValidateText Sprawdza, czy tekst jest dozwolony w bieżącym kontekście elementu i gromadzi tekst na potrzeby walidacji, jeśli bieżący element ma prostą zawartość.
ValidateWhitespace Sprawdza, czy biały znak jest dozwolony w bieżącym kontekście elementu i gromadzi białe znaki na potrzeby sprawdzania poprawności, czy bieżący element ma prostą zawartość.
ValidateEndElement Sprawdza, czy zawartość tekstowa elementu jest prawidłowa zgodnie z jego typem danych dla elementów z prostą zawartością i sprawdza, czy zawartość bieżącego elementu jest kompletna dla elementów o złożonej zawartości.
SkipToEndElement Pomija walidację bieżącej zawartości elementu i przygotowuje XmlSchemaValidator obiekt do weryfikowania zawartości w kontekście elementu nadrzędnego.
EndValidation Kończy sprawdzanie poprawności i sprawdza ograniczenia tożsamości dla całego dokumentu XML, jeśli opcja walidacji jest ustawiona ProcessIdentityConstraints .

Uwaga

Klasa XmlSchemaValidator ma zdefiniowane przejście stanu, które wymusza sekwencję i wystąpienie wywołań wykonanych do każdej z metod opisanych w poprzedniej tabeli. Konkretne przejście XmlSchemaValidator stanu klasy zostało opisane w sekcji "XmlSchemaValidator State Transition" tego tematu.

Przykład metod używanych do sprawdzania poprawności elementów, atrybutów i zawartości w zestawie informacji XML można znaleźć w przykładzie w poprzedniej sekcji. Aby uzyskać więcej informacji na temat tych metod, zobacz dokumentację referencyjną XmlSchemaValidator klas.

Weryfikowanie zawartości przy użyciu elementu XmlValueGetter

Element XmlValueGetterdelegate może służyć do przekazywania wartości atrybutów, tekstu lub białych węzłów jako typów środowiska uruchomieniowego języka wspólnego (CLR) zgodnych z typem języka definicji schematu XML (XSD) atrybutu, tekstu lub węzła odstępu. Jest XmlValueGetterdelegate to przydatne, jeśli wartość CLR atrybutu, tekstu lub węzła odstępu jest już dostępna i unika kosztu konwertowania go na element string , a następnie ponownej analizy w celu weryfikacji.

Metody ValidateAttribute, ValidateTexti ValidateWhitespace są przeciążone i akceptują wartość atrybutu, tekstu lub białych węzłów jako string lub XmlValueGetterdelegate.

Następujące metody XmlSchemaValidator klasy akceptują XmlValueGetterdelegate parametr jako parametr.

Poniżej przedstawiono przykład XmlValueGetterdelegate z przykładu XmlSchemaValidator klasy w wprowadzeniu. Funkcja XmlValueGetterdelegate zwraca wartość atrybutu jako DateTime obiekt. Aby sprawdzić poprawność tego DateTime obiektu zwróconego XmlValueGetterprzez obiekt , XmlSchemaValidator obiekt najpierw konwertuje go na wartość ValueType (ValueType jest domyślnym mapowaniem CLR dla typu XSD) dla typu danych atrybutu, a następnie sprawdza aspekty na przekonwertowanej wartości.

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

Aby zapoznać się z kompletnym przykładem elementu XmlValueGetterdelegate, zobacz przykład w wprowadzeniu. Aby uzyskać więcej informacji na temat programu , zobacz dokumentację referencyjną XmlValueGetterdelegateXmlValueGetterklas i .XmlSchemaValidator

Informacje po schemacie weryfikacji

Klasa XmlSchemaInfo reprezentuje niektóre informacje post-schema-validation-information węzła XML zweryfikowane przez klasę XmlSchemaValidator . Różne metody XmlSchemaValidator klasy akceptują XmlSchemaInfo obiekt jako opcjonalny parametr (null). out

Po pomyślnej weryfikacji właściwości XmlSchemaInfo obiektu są ustawiane z wynikami walidacji. Na przykład po pomyślnej weryfikacji atrybutu ValidateAttribute przy użyciu metody obiekt XmlSchemaInfo (jeśli określono) SchemaAttribute, SchemaType, MemberTypei Validity właściwości są ustawiane z wynikami walidacji.

Następujące XmlSchemaValidator metody klasy akceptują XmlSchemaInfo obiekt jako parametr out.

Pełny przykład XmlSchemaInfo klasy można znaleźć w przykładzie z wprowadzeniem. Aby uzyskać więcej informacji na temat klasy, zobacz dokumentację referencyjną XmlSchemaInfo XmlSchemaInfo klas.

Pobieranie oczekiwanych cząstek, atrybutów i nieokreślonych atrybutów domyślnych

Klasa XmlSchemaValidator udostępnia GetExpectedAttributesmetody , GetExpectedParticlesi GetUnspecifiedDefaultAttributes do pobierania oczekiwanych cząstek, atrybutów i nieokreślonych atrybutów domyślnych w bieżącym kontekście weryfikacji.

Pobieranie oczekiwanych cząstek

Metoda GetExpectedParticles zwraca tablicę XmlSchemaParticle obiektów zawierających oczekiwane cząstki w bieżącym kontekście elementu. Prawidłowe cząstki, które mogą być zwracane przez metodę GetExpectedParticles , to wystąpienia XmlSchemaElement klas i XmlSchemaAny .

Gdy komponator dla con tryb namiotu l jest , xs:sequencezwracana jest tylko następna cząstka w sekwencji. Jeśli komponator dla con tryb namiotu l jest lub xs:all xs:choice, zwracane są wszystkie prawidłowe cząstki, które mogą podążać w bieżącym kontekście elementu.

Uwaga

Jeśli metoda jest wywoływana GetExpectedParticles natychmiast po wywołaniu Initialize metody, GetExpectedParticles metoda zwraca wszystkie elementy globalne.

Na przykład w schemacie XML schema Definition Language (XSD) i dokumencie XML, który następuje po zweryfikowaniu book elementu, book element jest bieżącym kontekstem elementu. Metoda GetExpectedParticles zwraca tablicę zawierającą pojedynczy XmlSchemaElement obiekt reprezentujący title element. Gdy kontekst weryfikacji jest elementem title , GetExpectedParticles metoda zwraca pustą tablicę. GetExpectedParticles Jeśli metoda jest wywoływana po zweryfikowaniu title elementu, ale przed description zweryfikowaniem elementu zwraca tablicę zawierającą pojedynczy XmlSchemaElement obiekt reprezentujący description element. GetExpectedParticles Jeśli metoda jest wywoływana po zweryfikowaniu description elementu, zwraca tablicę zawierającą pojedynczy XmlSchemaAny obiekt reprezentujący symbol wieloznaczny.

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

W przykładzie jako dane wejściowe przyjmuje następujący kod XML:

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

W przykładzie jako dane wejściowe przyjmuje następujący schemat XSD:

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

Uwaga

Wyniki GetExpectedParticlesGetExpectedAttributesmetod , i AddSchema XmlSchemaValidator klasy zależą od weryfikowanego bieżącego kontekstu. Aby uzyskać więcej informacji, zobacz sekcję "Kontekst weryfikacji" tego tematu.

Aby zapoznać się z przykładem GetExpectedParticles metody, zobacz przykład z wprowadzenia. Aby uzyskać więcej informacji na temat metody, zobacz dokumentację referencyjną GetExpectedParticles XmlSchemaValidator klas.

Pobieranie oczekiwanych atrybutów

Metoda GetExpectedAttributes zwraca tablicę XmlSchemaAttribute obiektów zawierających oczekiwane atrybuty w bieżącym kontekście elementu.

Na przykład w przykładzie w wprowadzeniu GetExpectedAttributes metoda służy do pobierania wszystkich atrybutów book elementu.

Jeśli wywołasz metodę GetExpectedAttributes bezpośrednio po metodzie ValidateElement , zwracane są wszystkie atrybuty, które mogą pojawić się w dokumencie XML. Jeśli jednak wywołasz metodę GetExpectedAttributes po co najmniej jednym wywołaniu ValidateAttribute metody, zwracane są atrybuty, które nie zostały jeszcze zweryfikowane dla bieżącego elementu.

Uwaga

Wyniki GetExpectedParticlesGetExpectedAttributesmetod , i AddSchema XmlSchemaValidator klasy zależą od weryfikowanego bieżącego kontekstu. Aby uzyskać więcej informacji, zobacz sekcję "Kontekst weryfikacji" tego tematu.

Aby zapoznać się z przykładem GetExpectedAttributes metody, zobacz przykład z wprowadzenia. Aby uzyskać więcej informacji na temat metody, zobacz dokumentację referencyjną GetExpectedAttributes XmlSchemaValidator klas.

Pobieranie nieokreślonych atrybutów domyślnych

Metoda GetUnspecifiedDefaultAttributes wypełnia ArrayList określony obiektami XmlSchemaAttribute dla wszystkich atrybutów z wartościami domyślnymi, które nie zostały wcześniej zweryfikowane przy użyciu ValidateAttribute metody w kontekście elementu. Metoda powinna być wywoływana GetUnspecifiedDefaultAttributes po wywołaniu ValidateAttribute metody dla każdego atrybutu w kontekście elementu. Metoda GetUnspecifiedDefaultAttributes powinna służyć do określenia, jakie atrybuty domyślne mają zostać wstawione do weryfikowanego dokumentu XML.

Aby uzyskać więcej informacji na temat metody, zobacz dokumentację referencyjną GetUnspecifiedDefaultAttributes XmlSchemaValidator klas.

Obsługa zdarzeń weryfikacji schematu

Ostrzeżenia i błędy weryfikacji schematu napotkane podczas walidacji są obsługiwane przez ValidationEventHandler zdarzenie XmlSchemaValidator klasy.

Ostrzeżenia dotyczące walidacji schematu mają XmlSeverityType wartość błędów weryfikacji schematu Warning i mają XmlSeverityType wartość Error. Jeśli nie ValidationEventHandler przypisano elementu , zostanie XmlSchemaValidationException zgłoszony dla wszystkich błędów weryfikacji schematu z wartością XmlSeverityType Error. Jednak parametr XmlSchemaValidationException nie jest zgłaszany w przypadku ostrzeżeń dotyczących walidacji schematu z wartością XmlSeverityType Warning.

Poniżej przedstawiono przykład ValidationEventHandler , który odbiera ostrzeżenia weryfikacji schematu i błędy napotkane podczas walidacji schematu pobranego z przykładu w wprowadzeniu.

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

Aby zapoznać się z kompletnym przykładem elementu ValidationEventHandler, zobacz przykład w wprowadzeniu. Aby uzyskać więcej informacji, zobacz dokumentację referencyjną XmlSchemaInfo klas.

Przejście stanu XmlSchemaValidator

Klasa XmlSchemaValidator ma zdefiniowane przejście stanu, które wymusza sekwencję i wystąpienie wywołań wykonanych do każdej z metod używanych do sprawdzania poprawności elementów, atrybutów i zawartości w zestawie informacji XML.

W poniższej tabeli opisano przejście XmlSchemaValidator stanu klasy oraz sekwencję i wystąpienie wywołań metod, które można wykonać w każdym stanie.

Stan Przejście
Sprawdź poprawność Initialize ( |ValidateAttribute TopLevel*) EndValidation
TopLevel ValidateWhitespace | ValidateText | Pierwiastek
Element ValidateElementValidateAttribute* (ValidateEndOfAttributes Zawartość*)? ValidateEndElement |

ValidateElement ValidateAttribute* SkipToEndElement |

ValidateElementValidateAttribute* ValidateEndOfAttributes Zawartość*SkipToEndElement |
Zawartość ValidateWhitespace | ValidateText | Pierwiastek

Uwaga

Element InvalidOperationException jest zgłaszany przez każdą z metod w powyższej tabeli, gdy wywołanie metody jest wykonywane w nieprawidłowej kolejności zgodnie z bieżącym stanem XmlSchemaValidator obiektu.

W powyższej tabeli przejścia stanu użyto symboli interpunkcyjnych do opisania metod i innych stanów, które mogą być wywoływane dla każdego stanu przejścia XmlSchemaValidator stanu klasy. Używane symbole są tymi samymi symbolami znajdującymi się w dokumentacji standardów XML definicji typu dokumentu (DTD).

W poniższej tabeli opisano, jak symbole interpunkcyjne znalezione w powyższej tabeli przejścia stanu wpływają na metody i inne stany, które mogą być wywoływane dla każdego stanu w przejściu XmlSchemaValidator stanu klasy.

Symbol opis
| Można wywołać metodę lub stan (jeden przed paskiem lub po nim).
? Metoda lub stan poprzedzający znak zapytania jest opcjonalny, ale jeśli jest wywoływany, może być wywoływany tylko raz.
* Metoda lub stan poprzedzający symbol * jest opcjonalny i może być wywoływany więcej niż raz.

Kontekst weryfikacji

Metody XmlSchemaValidator klasy używane do sprawdzania poprawności elementów, atrybutów i zawartości w zestawie informacji XML zmieniają kontekst XmlSchemaValidator weryfikacji obiektu. Na przykład SkipToEndElement metoda pomija walidację bieżącej zawartości elementu i przygotowuje XmlSchemaValidator obiekt do sprawdzania poprawności zawartości w kontekście elementu nadrzędnego. Jest to równoważne pomijaniu walidacji dla wszystkich elementów podrzędnych bieżącego elementu, a następnie wywoływanie ValidateEndElement metody .

Wyniki GetExpectedParticlesGetExpectedAttributesmetod , i AddSchema XmlSchemaValidator klasy zależą od weryfikowanego bieżącego kontekstu.

W poniższej tabeli opisano wyniki wywoływania tych metod po wywołaniu jednej z metod XmlSchemaValidator klasy używanej do sprawdzania poprawności elementów, atrybutów i zawartości w zestawie informacji XML.

Method GetExpectedParticles GetExpectedAttributes AddSchema
Initialize Jeśli jest wywoływana metoda domyślna Initialize , GetExpectedParticles zwraca tablicę zawierającą wszystkie elementy globalne.

Jeśli przeciążona Initialize metoda, która przyjmuje XmlSchemaObject jako parametr, jest wywoływana w celu zainicjowania częściowej walidacji elementu, zwraca tylko element, GetExpectedParticles do którego XmlSchemaValidator zainicjowano obiekt.
Jeśli wywoływana jest metoda domyślna Initialize , GetExpectedAttributes zwraca pustą tablicę.

Jeśli przeciążenie Initialize metody, która przyjmuje XmlSchemaObject parametr jako parametr, jest wywoływane w celu zainicjowania częściowej weryfikacji atrybutu, zwraca tylko atrybut, GetExpectedAttributes do którego XmlSchemaValidator zainicjowano obiekt.
Dodaje schemat do XmlSchemaSet XmlSchemaValidator obiektu, jeśli nie ma błędów przetwarzania wstępnego.
ValidateElement Jeśli element kontekstu jest prawidłowy, GetExpectedParticles zwraca sekwencję elementów oczekiwanych jako elementy podrzędne elementu kontekstu.

Jeśli element kontekstu jest nieprawidłowy, GetExpectedParticles zwraca pustą tablicę.
Jeśli element kontekstu jest prawidłowy i jeśli nie zostało wcześniej wykonane żadne wywołanie ValidateAttribute , GetExpectedAttributes zwraca listę wszystkich atrybutów zdefiniowanych w elemecie kontekstu.

Jeśli niektóre atrybuty zostały już zweryfikowane, GetExpectedAttributes zwraca listę pozostałych atrybutów do zweryfikowania.

Jeśli element kontekstu jest nieprawidłowy, GetExpectedAttributes zwraca pustą tablicę.
Jak wyżej.
ValidateAttribute Jeśli atrybut kontekstu jest atrybutem najwyższego poziomu, GetExpectedParticles zwraca pustą tablicę.

W przeciwnym razie GetExpectedParticles zwraca sekwencję elementów oczekiwanych jako pierwsze podrzędne elementu kontekstu.
Jeśli atrybut kontekstu jest atrybutem najwyższego poziomu, GetExpectedAttributes zwraca pustą tablicę.

W przeciwnym razie GetExpectedAttributes zwraca listę pozostałych atrybutów do zweryfikowania.
Jak wyżej.
GetUnspecifiedDefaultAttributes GetExpectedParticles Zwraca sekwencję elementów oczekiwanych jako pierwsze podrzędne elementu kontekstu. GetExpectedAttributes Zwraca listę wymaganych i opcjonalnych atrybutów, które nie zostały jeszcze zweryfikowane dla elementu kontekstu. Jak wyżej.
ValidateEndOfAttributes GetExpectedParticles Zwraca sekwencję elementów oczekiwanych jako pierwsze podrzędne elementu kontekstu. GetExpectedAttributes Zwraca pustą tablicę. Jak wyżej.
ValidateText Jeśli właściwość contentType elementu kontekstu jest mieszana, GetExpectedParticles zwraca sekwencję elementów oczekiwanych w następnej pozycji.

Jeśli element kontekstu contentType ma wartość TextOnly lub Empty, GetExpectedParticles zwraca pustą tablicę.

Jeśli element kontekstu contentType ma wartość ElementOnly, zwraca sekwencję elementów oczekiwanych w następnej pozycji, GetExpectedParticles ale wystąpił już błąd weryfikacji.
GetExpectedAttributes Zwraca listę atrybutów, które nie zostały zweryfikowane przez element kontekstu. Jak wyżej.
ValidateWhitespace Jeśli kontekst biały jest odstępem najwyższego poziomu, GetExpectedParticles zwraca pustą tablicę.

GetExpectedParticles W przeciwnym razie zachowanie metody jest takie samo jak w metodzie ValidateText.
Jeśli kontekst biały jest odstępem najwyższego poziomu, GetExpectedAttributes zwraca pustą tablicę.

GetExpectedAttributes W przeciwnym razie zachowanie metody jest takie samo jak w metodzie ValidateText.
Jak wyżej.
ValidateEndElement GetExpectedParticles zwraca sekwencję elementów oczekiwanych po elemecie kontekstu (możliwe elementy równorzędne). GetExpectedAttributes Zwraca listę atrybutów, które nie zostały zweryfikowane przez element kontekstu.

Jeśli element kontekstu nie ma elementu nadrzędnego GetExpectedAttributes , zwraca pustą listę (element kontekstu jest elementem nadrzędnym bieżącego elementu, na którym ValidateEndElement został wywołany).
Jak wyżej.
SkipToEndElement Tak samo jak ValidateEndElement. Tak samo jak ValidateEndElement. Jak wyżej.
EndValidation Zwraca pustą tablicę. Zwraca pustą tablicę. Jak wyżej.

Uwaga

Wartości zwracane przez różne właściwości XmlSchemaValidator klasy nie są zmieniane przez wywołanie żadnej z metod w powyższej tabeli.

Zobacz też