Bagikan melalui


Validasi Berbasis Dorong dengan XmlSchemaValidator

Kelas XmlSchemaValidator menyediakan mekanisme yang efisien dan berkinerja tinggi untuk memvalidasi data XML terhadap skema XML secara aktif. Misalnya, XmlSchemaValidator kelas memungkinkan Anda memvalidasi infoset XML di tempat tanpa harus menserialisasikannya sebagai dokumen XML lalu memilah ulang dokumen menggunakan pembaca XML yang memvalidasi.

Kelas XmlSchemaValidator dapat digunakan dalam skenario lanjutan seperti membangun mesin validasi melalui sumber data XML kustom atau sebagai cara untuk membangun penulis XML yang memvalidasi.

Berikut ini adalah contoh penggunaan XmlSchemaValidator kelas untuk memvalidasi contosoBooks.xml file terhadap contosoBooks.xsd skema. Contoh ini menggunakan kelas XmlSerializer untuk mendeserialisasi contosoBooks.xml file dan meneruskan nilai simpul ke metode dari kelas XmlSchemaValidator.

Nota

Contoh ini digunakan di seluruh bagian topik ini.

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

Contoh mengambil file contosoBooks.xml sebagai input.

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

Contohnya juga mengambil contosoBooks.xsd sebagai input.

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

Memvalidasi Data XML menggunakan XmlSchemaValidator

Untuk mulai memvalidasi infoset XML, Anda harus terlebih dahulu menginisialisasi sebuah instans baru dari kelas XmlSchemaValidator dengan menggunakan konstruktor XmlSchemaValidator.

Konstruktor XmlSchemaValidator mengambil objek XmlNameTable, XmlSchemaSet, dan XmlNamespaceManager sebagai parameter serta nilai XmlSchemaValidationFlags sebagai parameter. Objek XmlNameTable digunakan untuk mengatomkan string namespace terkenal seperti namespace skema, namespace XML, dan sebagainya. Objek ini diteruskan ke metode ParseValue saat memvalidasi konten sederhana. Objek XmlSchemaSet berisi skema XML yang digunakan untuk memvalidasi himpunan info XML. Objek XmlNamespaceManager digunakan untuk mengatasi namespace yang ditemui selama validasi. Nilai XmlSchemaValidationFlags digunakan untuk menonaktifkan fitur validasi tertentu.

Untuk informasi selengkapnya tentang XmlSchemaValidator konstruktor, lihat dokumentasi kelas referensi XmlSchemaValidator.

Inisialisasi Validasi

Setelah sebuah objek XmlSchemaValidator dibangun, ada dua metode overload Initialize yang digunakan untuk menginisialisasi status objek XmlSchemaValidator. Berikut adalah dua metode Initialize.

Metode default XmlSchemaValidator.Initialize menginisialisasi XmlSchemaValidator objek ke status awalnya, dan metode kelebihan beban XmlSchemaValidator.Initialize yang mengambil XmlSchemaObject sebagai parameter menginisialisasi objek ke status awalnya untuk validasi parsial XmlSchemaValidator .

Kedua Initialize metode hanya dapat dipanggil segera setelah XmlSchemaValidator objek dibangun atau setelah panggilan ke EndValidation.

Untuk contoh metode XmlSchemaValidator.Initialize, lihat contohnya di bagian pengenalan. Untuk informasi lebih lanjut tentang metode Initialize, lihat dokumentasi referensi kelas XmlSchemaValidator.

Validasi Parsial

Metode XmlSchemaValidator.Initialize yang mengambil XmlSchemaObject sebagai parameter menginisialisasi objek ke status awal untuk validasi parsial XmlSchemaValidator .

Dalam contoh berikut, sebuah XmlSchemaObject diinisialisasi untuk validasi parsial menggunakan metode XmlSchemaValidator.Initialize. Elemen skema orderNumber diteruskan dengan memilih elemen skema orderNumber di dalam koleksi XmlSchemaObjectTable oleh GlobalElements yang dikembalikan oleh properti XmlSchemaSet dari objek . Objek XmlSchemaValidator kemudian memvalidasi elemen spesifik ini.

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

Contoh mengambil skema XML berikut sebagai input.

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

Untuk informasi lebih lanjut tentang metode Initialize, lihat dokumentasi referensi kelas XmlSchemaValidator.

Menambahkan Skema Tambahan

Metode AddSchemaXmlSchemaValidator kelas digunakan untuk menambahkan skema XML ke kumpulan skema yang digunakan selama validasi. Metode AddSchema ini dapat digunakan untuk mensimulasikan efek mengalami skema XML sebaris dalam himpunan info XML yang sedang divalidasi.

Nota

Namespace XmlSchema target parameter tidak dapat cocok dengan elemen atau atribut apa pun yang sudah ditemui oleh XmlSchemaValidator objek.

XmlSchemaValidationFlags.ProcessInlineSchema Jika nilai tidak diteruskan sebagai parameter ke XmlSchemaValidator konstruktor, AddSchema metode tidak melakukan apa pun.

Hasil AddSchema metode bergantung pada konteks simpul XML saat ini yang sedang divalidasi. Untuk informasi selengkapnya tentang konteks validasi, lihat bagian "Konteks Validasi" dari topik ini.

Untuk informasi lebih lanjut tentang metode AddSchema, lihat dokumentasi referensi kelas XmlSchemaValidator.

Memvalidasi Elemen, Atribut, dan Konten

Kelas ini XmlSchemaValidator menyediakan beberapa metode yang digunakan untuk memvalidasi elemen, atribut, dan konten dalam himpunan info XML terhadap skema XML. Tabel berikut ini menjelaskan masing-masing metode ini.

Metode Deskripsi
ValidateElement Memvalidasi nama elemen dalam konteks saat ini.
ValidateAttribute Memvalidasi atribut dalam konteks elemen saat ini atau terhadap objek yang diteruskan sebagai parameter ke metode XmlSchemaAttribute.
ValidateEndOfAttributes Memverifikasi apakah semua atribut yang diperlukan dalam konteks elemen ada dan menyiapkan XmlSchemaValidator objek untuk memvalidasi konten turunan elemen.
ValidateText Memvalidasi apakah teks diizinkan dalam konteks elemen saat ini, dan mengakumulasi teks untuk validasi jika elemen saat ini memiliki konten sederhana.
ValidateWhitespace Memvalidasi apakah spasi putih diizinkan dalam konteks elemen saat ini, dan mengakumulasi spasi putih untuk validasi apakah elemen saat ini memiliki konten sederhana.
ValidateEndElement Memverifikasi apakah konten teks elemen valid sesuai dengan jenis datanya untuk elemen dengan konten sederhana, dan memverifikasi apakah konten elemen saat ini lengkap untuk elemen dengan konten kompleks.
SkipToEndElement Melewati validasi konten elemen saat ini dan menyiapkan XmlSchemaValidator objek untuk memvalidasi konten dalam konteks elemen induk.
EndValidation Mengakhiri validasi dan memeriksa batasan identitas untuk seluruh dokumen XML jika ProcessIdentityConstraints opsi validasi diatur.

Nota

Kelas XmlSchemaValidator memiliki transisi status yang ditentukan yang memberlakukan urutan dan terjadinya panggilan yang dilakukan ke setiap metode yang dijelaskan dalam tabel sebelumnya. Transisi status spesifik kelas dijelaskan di bagian "Transisi XmlSchemaValidator Status XmlSchemaValidator" dari topik ini.

Untuk contoh metode yang digunakan untuk memvalidasi elemen, atribut, dan konten dalam himpunan info XML, lihat contoh di bagian sebelumnya. Untuk informasi selengkapnya tentang metode ini, lihat XmlSchemaValidator dokumentasi referensi kelas.

Memvalidasi Konten Menggunakan XmlValueGetter

XmlValueGetter delegate dapat digunakan untuk meneruskan nilai atribut, teks, atau simpul spasi putih sebagai jenis Common Language Runtime (CLR) yang kompatibel dengan jenis XML Schema Definition Language (XSD) dari atribut, teks, atau node spasi putih. Berguna XmlValueGetterdelegate jika nilai CLR dari atribut, teks, atau node spasi putih sudah tersedia, dan menghindari biaya konversi ke dan string kemudian membandingkannya lagi untuk validasi.

Metode ValidateAttribute, ValidateText, dan ValidateWhitespace kelebihan beban dan menerima nilai atribut, teks, atau node spasi putih sebagai string atau XmlValueGetterdelegate.

Metode XmlSchemaValidator kelas berikut menerima XmlValueGetterdelegate sebagai parameter.

Berikut ini adalah contoh XmlValueGetterdelegate yang diambil dari XmlSchemaValidator contoh kelas dalam pengenalan. mengembalikan XmlValueGetterdelegate nilai atribut sebagai DateTime objek. Untuk memvalidasi objek ini DateTime yang dikembalikan oleh XmlValueGetter, XmlSchemaValidator objek terlebih dahulu mengonversinya ke ValueType (ValueType adalah pemetaan CLR default untuk jenis XSD) untuk jenis data atribut lalu memeriksa faset pada nilai yang dikonversi.

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

Untuk contoh lengkap , XmlValueGetterdelegatelihat contoh dalam pengenalan. Untuk informasi selengkapnya tentang XmlValueGetterdelegate, lihat XmlValueGetterdokumentasi referensi kelas , dan XmlSchemaValidator .

Pascaskema-Validation-Information

Kelas ini XmlSchemaInfo mewakili beberapaValidation-Information Pasca-Skema dari simpul XML yang divalidasi XmlSchemaValidator oleh kelas . Berbagai metode XmlSchemaValidator kelas menerima XmlSchemaInfo objek sebagai parameter opsional, (null). out

Setelah validasi berhasil, properti XmlSchemaInfo objek diatur dengan hasil validasi. Misalnya, setelah validasi atribut yang berhasil menggunakan ValidateAttribute metode , XmlSchemaInfo objek (jika ditentukan) SchemaAttribute, SchemaType, MemberType, dan Validity properti diatur dengan hasil validasi.

Metode kelas berikut XmlSchemaValidator menerima XmlSchemaInfo objek sebagai parameter keluar.

Untuk contoh XmlSchemaInfo lengkap kelas, lihat contoh dalam pengenalan. Untuk informasi selengkapnya tentang XmlSchemaInfo kelas, lihat XmlSchemaInfo dokumentasi referensi kelas.

Mengambil Kembali Partikel, Atribut, dan Atribut Default yang Tidak Ditentukan

Kelas XmlSchemaValidator menyediakan metode GetExpectedAttributes, GetExpectedParticles, dan GetUnspecifiedDefaultAttributes untuk mengambil partikel yang diharapkan, atribut, dan atribut default yang tidak ditentukan dalam konteks validasi saat ini.

Mengambil Partikel yang Diharapkan

Metode mengembalikan GetExpectedParticles array XmlSchemaParticle objek yang berisi partikel yang diharapkan dalam konteks elemen saat ini. Partikel valid yang dapat dikembalikan oleh GetExpectedParticles metode adalah instans kelas XmlSchemaElement dan XmlSchemaAny .

Ketika komposit untuk model konten adalah xs:sequence, hanya partikel berikutnya dalam urutan yang dikembalikan. Jika komposit untuk model konten adalah xs:all atau xs:choice, maka semua partikel valid yang dapat mengikuti dalam konteks elemen saat ini dikembalikan.

Nota

Jika metode GetExpectedParticles dipanggil segera setelah metode Initialize dipanggil, metode GetExpectedParticles mengembalikan semua elemen global.

Misalnya, dalam skema XML Schema Definition Language (XSD) dan dokumen XML berikut, setelah memvalidasi elemen book, elemen book adalah konteks elemen saat ini. Metode mengembalikan GetExpectedParticles array yang berisi satu XmlSchemaElement objek yang mewakili title elemen . Ketika konteks validasi adalah title elemen , GetExpectedParticles metode mengembalikan array kosong. GetExpectedParticles Jika metode dipanggil setelah title elemen divalidasi tetapi sebelum description elemen divalidasi, metode mengembalikan array yang berisi satu XmlSchemaElement objek yang mewakili description elemen . Jika metode GetExpectedParticles dipanggil setelah elemen description divalidasi, maka ia mengembalikan array yang berisi satu objek XmlSchemaAny yang mewakili kartu bebas.

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

Contoh mengambil XML berikut sebagai input:

<xs:schema xmlns:xs="http://www.w3c.org/2001/XMLSchema">
  <xs:element name="book">
    <xs:sequence>
      <xs:element name="title" type="xs:string" />
      <xs:element name="description" type="xs:string" />
      <xs:any processContent="lax" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:element>
</xs:schema>

Contoh mengambil skema XSD berikut sebagai input:

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

Nota

Hasil dari metode GetExpectedParticles, GetExpectedAttributes, dan AddSchema dari kelas XmlSchemaValidator bergantung pada konteks saat ini yang sedang divalidasi. Untuk informasi selengkapnya, lihat bagian "Konteks Validasi" dari topik ini.

Untuk contoh metode GetExpectedParticles, lihat contohnya di bagian pengenalan. Untuk informasi lebih lanjut tentang metode GetExpectedParticles, lihat dokumentasi referensi kelas XmlSchemaValidator.

Mengambil Atribut yang Diharapkan

Metode ini mengembalikan array objek yang berisi atribut yang diharapkan di dalam konteks elemen saat ini.

Misalnya, dalam contoh pada pengantar, metode GetExpectedAttributes ini digunakan untuk mengambil semua atribut elemen book.

Jika Anda memanggil GetExpectedAttributes metode segera setelah ValidateElement metode , semua atribut yang dapat muncul dalam dokumen XML dikembalikan. Namun, jika Anda memanggil GetExpectedAttributes metode setelah satu atau beberapa panggilan ke ValidateAttribute metode , atribut yang belum divalidasi untuk elemen saat ini dikembalikan.

Nota

Hasil dari metode GetExpectedParticles, GetExpectedAttributes, dan AddSchema dari kelas XmlSchemaValidator bergantung pada konteks saat ini yang sedang divalidasi. Untuk informasi selengkapnya, lihat bagian "Konteks Validasi" dari topik ini.

Untuk contoh metode GetExpectedAttributes, lihat contohnya di bagian pengenalan. Untuk informasi lebih lanjut tentang metode GetExpectedAttributes, lihat dokumentasi referensi kelas XmlSchemaValidator.

Mengambil Atribut Default yang Tidak Ditentukan

Metode GetUnspecifiedDefaultAttributes mengisi ArrayList yang ditentukan dengan objek XmlSchemaAttribute untuk setiap atribut yang memiliki nilai default dan belum divalidasi sebelumnya dalam konteks elemen menggunakan metode ValidateAttribute. Metode GetUnspecifiedDefaultAttributes harus dipanggil setelah memanggil ValidateAttribute metode pada setiap atribut dalam konteks elemen. Metode GetUnspecifiedDefaultAttributes harus digunakan untuk menentukan atribut default apa yang akan dimasukkan ke dalam dokumen XML yang sedang divalidasi.

Untuk informasi lebih lanjut tentang metode GetUnspecifiedDefaultAttributes, lihat dokumentasi referensi kelas XmlSchemaValidator.

Menangani Peristiwa Validasi Skema

Peringatan validasi skema dan kesalahan yang ditemui selama validasi ditangani oleh kejadian dari kelas ValidationEventHandlerXmlSchemaValidator.

Peringatan validasi skema memiliki XmlSeverityType nilai Warning dan kesalahan validasi skema memiliki XmlSeverityType nilai Error. Jika tidak ada ValidationEventHandler yang ditetapkan, sebuah XmlSchemaValidationException dilemparkan untuk semua kesalahan validasi skema dengan nilai XmlSeverityType dari Error. Namun, XmlSchemaValidationException tidak dilemparkan untuk peringatan validasi skema dengan XmlSeverityType nilai Warning.

Berikut ini adalah contoh ValidationEventHandler yang menerima peringatan validasi skema dan kesalahan yang ditemui selama validasi skema yang diambil dari contoh dalam pengenalan.

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

Untuk contoh lengkap ValidationEventHandler, lihat contoh dalam pendahuluan. Untuk informasi selengkapnya, lihat XmlSchemaInfo dokumentasi referensi kelas.

Transisi Status Validasi XmlSchemaValidator

Kelas XmlSchemaValidator ini memiliki transisi status yang ditentukan yang memberlakukan urutan dan terjadinya panggilan yang dilakukan ke setiap metode yang digunakan untuk memvalidasi elemen, atribut, dan konten dalam himpunan info XML.

Tabel berikut menjelaskan transisi keadaan dari kelas XmlSchemaValidator, dan menjelaskan urutan serta terjadinya panggilan metode yang dapat dilakukan di setiap keadaan.

Negara Transisi
Validasi Initialize ( |ValidateAttribute Tingkat Atas*) EndValidation
Tingkat Tertinggi ValidateWhitespace | ValidateText | Elemen
Elemen ValidateElement ValidateAttribute* (ValidateEndOfAttributes Konten*)? ValidateEndElement |

ValidateElement ValidateAttribute * SkipToEndElement |

ValidateElement ValidateAttribute * ValidateEndOfAttributes Konten* SkipToEndElement |
Isi ValidateWhitespace | ValidateText | Elemen

Nota

InvalidOperationException dilemparkan oleh masing-masing metode dalam tabel di atas ketika panggilan ke metode dilakukan dalam urutan yang XmlSchemaValidator salah sesuai dengan status objek saat ini.

Tabel transisi status di atas menggunakan simbol tanda baca untuk menjelaskan metode dan status lain yang dapat dipanggil untuk setiap status dalam transisi status dari kelas XmlSchemaValidator. Simbol yang digunakan adalah simbol yang sama yang ditemukan dalam referensi Standar XML untuk Definisi Tipe Dokumen (DTD).

Tabel berikut menjelaskan bagaimana simbol tanda baca yang ditemukan dalam tabel transisi status di atas memengaruhi metode dan status lainnya yang dapat dipanggil untuk setiap status dalam transisi status kelas XmlSchemaValidator.

Lambang Deskripsi
| Baik metode atau status (yang sebelum bilah atau yang setelahnya) dapat dipanggil.
? Metode atau status yang mendahului tanda tanya bersifat opsional tetapi jika disebut hanya dapat dipanggil sekali.
* Metode atau status yang mendahului simbol * bersifat opsional, dan dapat dipanggil lebih dari sekali.

Konteks Validasi

Metode kelas XmlSchemaValidator yang digunakan untuk memvalidasi elemen, atribut, dan konten dalam himpunan info XML mengubah konteks validasi dari objek XmlSchemaValidator. Misalnya, SkipToEndElement metode melewati validasi konten elemen saat ini dan menyiapkan XmlSchemaValidator objek untuk memvalidasi konten dalam konteks elemen induk; setara dengan melewatkan validasi untuk semua turunan elemen saat ini dan kemudian memanggil ValidateEndElement metode .

Hasil dari metode GetExpectedParticles, GetExpectedAttributes, dan AddSchema dari kelas XmlSchemaValidator bergantung pada konteks saat ini yang sedang divalidasi.

Tabel berikut menjelaskan hasil panggilan metode ini setelah memanggil salah satu metode kelas yang XmlSchemaValidator digunakan untuk memvalidasi elemen, atribut, dan konten dalam himpunan info XML.

Metode DapatkanPartikelYangDiharapkan DapatkanAtributYangDiharapkan TambahSkema
Initialize Jika metode default Initialize dipanggil, GetExpectedParticles mengembalikan array yang berisi semua elemen global.

Jika metode kelebihan beban Initialize yang mengambil XmlSchemaObject sebagai parameter dipanggil untuk menginisialisasi validasi parsial elemen, GetExpectedParticles hanya mengembalikan elemen tempat XmlSchemaValidator objek diinisialisasi.
Jika metode default Initialize dipanggil, GetExpectedAttributes mengembalikan array kosong.

Jika overload metode Initialize yang menerima XmlSchemaObject sebagai parameter dipanggil untuk memulai validasi parsial atribut, GetExpectedAttributes hanya mengembalikan atribut di mana objek XmlSchemaValidator diinisialisasi.
Menambahkan skema ke XmlSchemaSet objek XmlSchemaValidator jika tidak terdapat kesalahan pra-pemrosesan.
ValidateElement Jika elemen konteks valid, GetExpectedParticles mengembalikan urutan elemen yang diharapkan sebagai turunan dari elemen konteks.

Jika elemen konteks tidak valid, GetExpectedParticles mengembalikan array kosong.
Jika elemen konteks valid, dan jika sebelumnya tidak ada panggilan ke ValidateAttribute , GetExpectedAttributes mengembalikan daftar semua atribut yang ditentukan pada elemen konteks.

Jika beberapa atribut telah divalidasi, GetExpectedAttributes mengembalikan daftar atribut yang tersisa untuk divalidasi.

Jika elemen konteks tidak valid, GetExpectedAttributes mengembalikan array kosong.
Sama seperti di atas.
ValidateAttribute Jika atribut konteks adalah atribut tingkat atas, GetExpectedParticles mengembalikan array kosong.

Jika tidak, GetExpectedParticles mengembalikan urutan elemen yang diharapkan sebagai anak pertama dari elemen konteks.
Jika atribut konteks adalah atribut tingkat atas, GetExpectedAttributes mengembalikan array kosong.

Jika tidak GetExpectedAttributes , mengembalikan daftar atribut yang tersisa untuk divalidasi.
Sama seperti di atas.
GetUnspecifiedDefaultAttributes GetExpectedParticles mengembalikan urutan elemen yang diharapkan sebagai turunan pertama dari elemen konteks. GetExpectedAttributes mengembalikan daftar atribut yang diperlukan dan opsional yang belum divalidasi untuk elemen konteks. Sama seperti di atas.
ValidateEndOfAttributes GetExpectedParticles mengembalikan urutan elemen yang diharapkan sebagai turunan pertama dari elemen konteks. GetExpectedAttributes menghasilkan array kosong. Sama seperti di atas.
ValidateText Jika contentType elemen konteks adalah Mixed, GetExpectedParticles mengembalikan urutan elemen yang diharapkan di posisi berikutnya.

Jika contentType elemen konteks adalah TextOnly atau Kosong, GetExpectedParticles mengembalikan array kosong.

Jika contentType elemen konteks adalah ElementOnly, GetExpectedParticles mengembalikan urutan elemen yang diharapkan di posisi berikutnya tetapi kesalahan validasi telah terjadi.
GetExpectedAttributes mengembalikan daftar atribut elemen konteks yang tidak divalidasi. Sama seperti di atas.
ValidateWhitespace Jika spasi putih konteks adalah spasi putih tingkat atas, GetExpectedParticles mengembalikan array kosong.

GetExpectedParticles Jika tidak, perilaku metode sama seperti dalam ValidateText.
Jika spasi putih konteks adalah spasi putih tingkat atas, GetExpectedAttributes mengembalikan array kosong.

GetExpectedAttributes Jika tidak, perilaku metode sama seperti dalam ValidateText.
Sama seperti di atas.
ValidateEndElement GetExpectedParticles mengembalikan urutan elemen yang diharapkan setelah elemen konteks (kemungkinan saudara kandung). GetExpectedAttributes mengembalikan daftar atribut elemen konteks yang tidak divalidasi.

Jika elemen konteks tidak memiliki induk, maka GetExpectedAttributes mengembalikan daftar kosong (elemen konteks adalah induk dari elemen saat ini yang ValidateEndElement dipanggil).
Sama seperti di atas.
SkipToEndElement Sama seperti ValidateEndElement. Sama seperti ValidateEndElement. Sama seperti di atas.
EndValidation Mengembalikan array kosong. Mengembalikan array kosong. Sama seperti di atas.

Nota

Nilai yang dikembalikan oleh berbagai properti XmlSchemaValidator kelas tidak diubah dengan memanggil salah satu metode dalam tabel di atas.

Lihat juga