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ą XmlValueGetterdelegate
XmlValueGetterklas 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:sequence
zwracana 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.