Přímé ověření XmlSchemaValidator
Třída XmlSchemaValidator poskytuje efektivní vysoce výkonný mechanismus pro ověření dat XML ve schématech XML na základě nabízených oznámení. Třída například XmlSchemaValidator umožňuje ověřit místní informační sadu XML, aniž byste ji museli serializovat jako dokument XML a pak znovu vytvořit dokument pomocí validující čtečky XML.
Třídu XmlSchemaValidator lze použít v pokročilých scénářích, jako je vytváření ověřovacích modulů přes vlastní zdroje dat XML nebo jako způsob, jak vytvořit validační zapisovač XML.
Následuje příklad použití XmlSchemaValidator třídy k ověření contosoBooks.xml
souboru proti schématu contosoBooks.xsd
. Příklad používá XmlSerializer třídu k deserializaci contosoBooks.xml
souboru a předání hodnoty uzlů metodám XmlSchemaValidator třídy.
Poznámka:
Tento příklad se používá v částech tohoto tématu.
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
Příklad vezme contosoBooks.xml
soubor jako vstup.
<?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>
Příklad také přebírá contosoBooks.xsd
jako vstup.
<?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>
Ověřování dat XML pomocí XmlSchemaValidator
Chcete-li začít ověřovat informační sadu XML, musíte nejprve inicializovat novou instanci XmlSchemaValidator třídy pomocí konstruktoru XmlSchemaValidator .
Konstruktor XmlSchemaValidator přebírá XmlNameTable, XmlSchemaSeta XmlNamespaceManager objekty jako parametry a také XmlSchemaValidationFlags hodnotu jako parametr. Objekt XmlNameTable se používá k atomizaci dobře známých řetězců oboru názvů, jako je obor názvů schématu, obor názvů XML atd., a je předán metodě při ověřování jednoduchého ParseValue obsahu. Objekt XmlSchemaSet obsahuje schémata XML použitá k ověření informační sady XML. Objekt XmlNamespaceManager se používá k překladu oborů názvů, ke kterým došlo během ověřování. Hodnota XmlSchemaValidationFlags se používá k zakázání určitých funkcí ověření.
Další informace o konstruktoru XmlSchemaValidator naleznete v XmlSchemaValidator referenční dokumentaci ke třídě.
Inicializace ověření
Po vytvoření objektu XmlSchemaValidator existují dvě přetížené Initialize metody, které slouží k inicializaci stavu objektu XmlSchemaValidator . Následují dvě Initialize metody.
Výchozí XmlSchemaValidator.Initialize metoda inicializuje XmlSchemaValidator objekt do počátečního stavu a přetížená XmlSchemaValidator.Initialize metoda, která přebírá XmlSchemaObject jako parametr inicializuje XmlSchemaValidator objekt do jeho počátečního stavu pro částečné ověření.
Obě Initialize metody lze volat pouze ihned po vytvoření objektu XmlSchemaValidator nebo po volání EndValidation.
Příklad XmlSchemaValidator.Initialize metody najdete v příkladu v úvodu. Další informace o Initialize metodě naleznete v XmlSchemaValidator referenční dokumentaci ke třídě.
Částečné ověření
Metoda XmlSchemaValidator.Initialize , která přebírá XmlSchemaObject jako parametr inicializuje XmlSchemaValidator objekt do jeho počátečního stavu pro částečné ověření.
V následujícím příkladu XmlSchemaObject je inicializován pro částečné ověření pomocí XmlSchemaValidator.Initialize metody. Prvek orderNumber
schématu je předán výběrem prvku XmlQualifiedName schématu v XmlSchemaObjectTable kolekci vrácené GlobalElements vlastností objektu XmlSchemaSet . Objekt XmlSchemaValidator pak ověří tento konkrétní prvek.
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);
V příkladu se jako vstup používá následující schéma XML.
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="orderNumber" type="xs:int" />
</xs:schema>
Další informace o Initialize metodě naleznete v XmlSchemaValidator referenční dokumentaci ke třídě.
Přidání dalších schémat
Metoda AddSchema XmlSchemaValidator třídy se používá k přidání schématu XML do sady schémat používaných při ověřování. Metodu AddSchema lze použít k simulaci efektu výskytu vloženého schématu XML v ověřované sadě informací XML.
Poznámka:
Cílový obor názvů parametru XmlSchema se nemůže shodovat s žádným prvkem nebo atributem, který XmlSchemaValidator již objekt zjistil.
XmlSchemaValidationFlags.ProcessInlineSchema Pokud hodnota nebyla předána jako parametr XmlSchemaValidator konstruktoru, AddSchema metoda nic nedělá.
Výsledek AddSchema metody závisí na ověření aktuálního kontextu uzlu XML. Další informace o kontextech ověření najdete v části Kontext ověření v tomto tématu.
Další informace o AddSchema metodě naleznete v XmlSchemaValidator referenční dokumentaci ke třídě.
Ověřování elementů, atributů a obsahu
Třída XmlSchemaValidator poskytuje několik metod, které slouží k ověření prvků, atributů a obsahu v informační sadě XML pro schémata XML. Následující tabulka popisuje každou z těchto metod.
metoda | Popis |
---|---|
ValidateElement | Ověří název elementu v aktuálním kontextu. |
ValidateAttribute | Ověří atribut v kontextu aktuálního prvku nebo proti objektu XmlSchemaAttribute předaného jako parametr metodě Initialize . |
ValidateEndOfAttributes | Ověřuje, zda jsou přítomny všechny požadované atributy v kontextu elementu a připraví XmlSchemaValidator objekt k ověření podřízeného obsahu elementu. |
ValidateText | Ověří, jestli je text povolený v kontextu aktuálního elementu, a shromažďuje text pro ověření, pokud má aktuální prvek jednoduchý obsah. |
ValidateWhitespace | Ověří, jestli je v kontextu aktuálního prvku povolená mezera, a shromažďuje prázdné znaky pro ověření, zda aktuální prvek má jednoduchý obsah. |
ValidateEndElement | Ověřuje, zda je textový obsah prvku platný podle jeho datového typu pro prvky s jednoduchým obsahem, a ověřuje, zda je obsah aktuálního prvku úplný pro prvky se složitým obsahem. |
SkipToEndElement | Přeskočí ověření aktuálního obsahu elementu XmlSchemaValidator a připraví objekt k ověření obsahu v kontextu nadřazeného elementu. |
EndValidation | Ukončí ověřování a kontroluje omezení identity pro celý dokument XML, pokud je nastavena ProcessIdentityConstraints možnost ověření. |
Poznámka:
Třída XmlSchemaValidator má definovaný přechod stavu, který vynucuje posloupnost a výskyt volání provedených pro každou z metod popsaných v předchozí tabulce. Konkrétní přechod XmlSchemaValidator stavu třídy je popsán v části XmlSchemaValidator State Transition v tomto tématu.
Příklad metod použitých k ověření prvků, atributů a obsahu v informační sadě XML najdete v příkladu v předchozí části. Další informace o těchto metodách naleznete v XmlSchemaValidator referenční dokumentaci ke třídám.
Ověřování obsahu pomocí XmlValueGetter
Dá XmlValueGetterdelegate
se použít k předání hodnoty atributů, textu nebo prázdných uzlů jako typů CLR (Common Language Runtime) kompatibilních s typem XSD (XML Schema Definition Language Language) atributu, textu nebo prázdného uzlu. To XmlValueGetterdelegate
je užitečné, pokud je hodnota CLR atributu, textu nebo prázdného uzlu již k dispozici, a zabraňuje nákladům na převod string
na atribut a následné opětovné oddělení pro ověření.
, a metody jsou přetíženy a přijímají hodnotu atributu, textu nebo prázdných uzlů jako nebodelegate
string
XmlValueGetter.ValidateWhitespace ValidateTextValidateAttribute
Následující metody XmlSchemaValidator třídy přijímají XmlValueGetterdelegate
jako parametr.
Následuje příklad XmlValueGetterdelegate
z příkladu XmlSchemaValidator třídy v úvodu. Vrátí XmlValueGetterdelegate
hodnotu atributu jako DateTime objektu. Chcete-li ověřit tento DateTime objekt vrácený XmlValueGetterobjektem , XmlSchemaValidator objekt nejprve převede na ValueType (ValueType je výchozí mapování CLR pro typ XSD) pro datový typ atributu a poté zkontroluje omezující vlastnosti převedené hodnoty.
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);
}
Úplný příklad tohoto příkladu XmlValueGetterdelegate
najdete v příkladu v úvodu. Další informace o nástroji XmlValueGetterdelegate
, naleznete v XmlValueGetterreferenční dokumentaci a XmlSchemaValidator třídy.
Informace po ověření schématu
Třída XmlSchemaInfo představuje některé post-Schema-Validation-Information uzlu XML ověřované XmlSchemaValidator třídou. Různé metody XmlSchemaValidator třídy přijímají XmlSchemaInfo objekt jako volitelný parametr (null
). out
Po úspěšném ověření se vlastnosti objektu XmlSchemaInfo nastaví s výsledky ověření. Například při úspěšném ověření atributu pomocí ValidateAttribute metody, XmlSchemaInfo objekt (pokud je zadán) SchemaAttributeSchemaType, MemberTypea Validity vlastnosti jsou nastaveny s výsledky ověření.
Následující XmlSchemaValidator metody třídy přijímají XmlSchemaInfo objekt jako out parametr.
Úplný příklad XmlSchemaInfo třídy najdete v příkladu v úvodu. Další informace o XmlSchemaInfo třídě najdete v XmlSchemaInfo referenční dokumentaci ke třídě.
Načítání očekávaných částic, atributů a nespecifikovaných výchozích atributů
Třída XmlSchemaValidator poskytuje GetExpectedAttributes, GetExpectedParticlesa GetUnspecifiedDefaultAttributes metody načíst očekávané částice, atributy a nezadané výchozí atributy v aktuálním kontextu ověření.
Načítání očekávaných částic
Metoda GetExpectedParticles vrátí pole XmlSchemaParticle objektů obsahujících očekávané částice v kontextu aktuálního prvku. Platné částice, které mohou být vráceny GetExpectedParticles metodou, jsou instancemi XmlSchemaElement a XmlSchemaAny třídy.
Když kompozitor pro kon režim stanu l je xs:sequence
, je vrácena pouze další částice v sekvenci. Pokud je kompozitor pro kon režim stanu l xs:all
nebo xs:choice
, vrátí se všechny platné částice, které by mohly následovat v kontextu aktuálního prvku.
Poznámka:
GetExpectedParticles Pokud metoda je volána okamžitě po volání Initialize metody, GetExpectedParticles vrátí metoda všechny globální prvky.
Například ve schématu XML Schema Definition Language (XSD) a dokumentu XML, který následuje po ověření book
elementu, book
je element aktuálním kontextem elementu. Metoda GetExpectedParticles vrátí pole obsahující jeden XmlSchemaElement objekt představující title
prvek. Pokud je title
kontextem ověření prvek, GetExpectedParticles metoda vrátí prázdné pole. GetExpectedParticles Pokud metoda je volána po title
ověření elementu, ale před ověřením elementudescription
, vrátí pole obsahující jeden XmlSchemaElement objekt představující description
prvek. GetExpectedParticles Pokud metoda je volána po description
ověření elementu, vrátí pole obsahující jeden XmlSchemaAny objekt představující zástupný znak.
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);
Příklad přebírá jako vstup následující kód 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>
Příklad používá jako vstup následující schéma XSD:
<book>
<title>My Book</title>
<description>My Book's Description</description>
<namespace>System.Xml.Schema</namespace>
</book>
Poznámka:
Výsledky GetExpectedParticlestřídy , GetExpectedAttributesa AddSchema metody XmlSchemaValidator jsou závislé na aktuálním kontextu, který je ověřen. Další informace najdete v části Kontext ověření v tomto tématu.
Příklad GetExpectedParticles metody najdete v příkladu v úvodu. Další informace o GetExpectedParticles metodě naleznete v XmlSchemaValidator referenční dokumentaci ke třídě.
Načítání očekávaných atributů
Metoda GetExpectedAttributes vrátí pole XmlSchemaAttribute objektů obsahující očekávané atributy v kontextu aktuálního elementu.
Například v příkladu v úvodu GetExpectedAttributes se metoda používá k načtení všech atributů elementu book
.
Pokud metodu GetExpectedAttributes zavoláte ihned za metodou ValidateElement , vrátí se všechny atributy, které by se mohly zobrazit v dokumentu XML. Pokud však voláte metodu GetExpectedAttributes po jednom nebo několika voláních ValidateAttribute metody, vrátí se atributy, které ještě nebyly ověřeny pro aktuální prvek.
Poznámka:
Výsledky GetExpectedParticlestřídy , GetExpectedAttributesa AddSchema metody XmlSchemaValidator jsou závislé na aktuálním kontextu, který je ověřen. Další informace najdete v části Kontext ověření v tomto tématu.
Příklad GetExpectedAttributes metody najdete v příkladu v úvodu. Další informace o GetExpectedAttributes metodě naleznete v XmlSchemaValidator referenční dokumentaci ke třídě.
Načítání nezadaného výchozího atributu
Metoda GetUnspecifiedDefaultAttributes naplní ArrayList zadané XmlSchemaAttribute objekty pro všechny atributy výchozími hodnotami, které nebyly dříve ověřeny pomocí ValidateAttribute metody v kontextu elementu. Metoda GetUnspecifiedDefaultAttributes by měla být volána po volání ValidateAttribute metody pro každý atribut v kontextu elementu. Metoda GetUnspecifiedDefaultAttributes by se měla použít k určení výchozích atributů, které se mají vložit do ověřovaného dokumentu XML.
Další informace o GetUnspecifiedDefaultAttributes metodě naleznete v XmlSchemaValidator referenční dokumentaci ke třídě.
Zpracování událostí ověření schématu
Upozornění a chyby ověřování schématu ValidationEventHandler , ke kterým došlo během ověřování, se zpracovávají událostí XmlSchemaValidator třídy.
Upozornění na ověření schématu mají XmlSeverityType hodnotu Warning a chyby ověření schématu XmlSeverityType mají hodnotu Error. Pokud nebyla přiřazena žádná ValidationEventHandler , XmlSchemaValidationException vyvolá se chyba pro všechny chyby ověření schématu XmlSeverityType s hodnotou Error. Není XmlSchemaValidationException však vyvolán pro upozornění na ověření schématu XmlSeverityType s hodnotou Warning.
Následuje příklad ValidationEventHandler , který obdrží upozornění na ověření schématu a chyby, ke kterým došlo během ověřování schématu převzatého z příkladu v úvodu.
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;
}
}
Úplný příklad tohoto příkladu ValidationEventHandlernajdete v příkladu v úvodu. Další informace najdete v referenční dokumentaci ke třídě XmlSchemaInfo .
Přechod stavu XmlSchemaValidator
Třída XmlSchemaValidator má definovaný přechod stavu, který vynucuje posloupnost a výskyt volání provedených pro každou z metod používaných k ověření prvků, atributů a obsahu v informační sadě XML.
Následující tabulka popisuje přechod XmlSchemaValidator stavu třídy a posloupnost a výskyt volání metody, které lze provést v jednotlivých stavech.
State | Transition |
---|---|
Ověřit | Initialize (ValidateAttribute | TopLevel*) EndValidation |
TopLevel | ValidateWhitespace | ValidateText | Element |
Element (Prvek) | ValidateElementValidateAttribute* (ValidateEndOfAttributes Obsah*)? ValidateEndElement | ValidateElement ValidateAttribute* SkipToEndElement | ValidateElementValidateAttribute* ValidateEndOfAttributes Obsah*SkipToEndElement | |
Content | ValidateWhitespace | ValidateText | Element |
Poznámka:
Je InvalidOperationException vyvolán každou z metod v tabulce výše, když volání metody je provedeno v nesprávné sekvenci podle aktuálního stavu objektu XmlSchemaValidator .
Výše uvedená tabulka přechodu stavu používá interpunkční symboly k popisu metod a dalších stavů, které lze volat pro každý stav přechodu XmlSchemaValidator stavu třídy. Použité symboly jsou stejné symboly, které najdete v odkazu na standardy XML pro definici typu dokumentu (DTD).
Následující tabulka popisuje, jak interpunkční symboly nalezené v tabulce přechodu stavu výše ovlivňují metody a další stavy, které lze volat pro každý stav v přechodu XmlSchemaValidator stavu třídy.
Symbol | Popis |
---|---|
| | Je možné volat metodu nebo stav (ten před pruhem nebo za ním). |
? | Metoda nebo stav, který předchází otazníku, je nepovinný, ale pokud je volána, lze ji volat pouze jednou. |
* | Metoda nebo stav, který předchází symbolu *, je nepovinný a lze volat více než jednou. |
Kontext ověření
Metody XmlSchemaValidator třídy používané k ověření elementů, atributů a obsahu v informační sadě XML změní kontext ověření objektu XmlSchemaValidator . Metoda například SkipToEndElement přeskočí ověření aktuálního obsahu elementu a připraví XmlSchemaValidator objekt k ověření obsahu v kontextu nadřazeného elementu; je ekvivalentní vynechání ověření pro všechny podřízené položky aktuálního elementu a následné volání ValidateEndElement metody.
Výsledky GetExpectedParticlestřídy , GetExpectedAttributesa AddSchema metody XmlSchemaValidator jsou závislé na aktuálním kontextu, který je ověřen.
Následující tabulka popisuje výsledky volání těchto metod po volání jedné z metod XmlSchemaValidator třídy sloužící k ověření prvků, atributů a obsahu v informační sadě XML.
metoda | GetExpectedParticles | GetExpectedAttributes | AddSchema |
---|---|---|---|
Initialize | Pokud je volána výchozí Initialize metoda, GetExpectedParticles vrátí pole obsahující všechny globální prvky. Pokud přetížená Initialize metoda, která přebírá XmlSchemaObject jako parametr je volána k inicializaci částečného ověření elementu, vrátí pouze prvek, GetExpectedParticles do kterého XmlSchemaValidator byl objekt inicializován. |
Pokud je volána výchozí Initialize metoda, GetExpectedAttributes vrátí prázdnou matici. Pokud přetížení Initialize metody, která přebírá XmlSchemaObject jako parametr je volána k inicializaci částečného ověření atributu, vrátí pouze atribut, GetExpectedAttributes do kterého XmlSchemaValidator byl objekt inicializován. |
Přidá schéma do XmlSchemaSet objektu XmlSchemaValidator , pokud nemá žádné chyby předběžného zpracování. |
ValidateElement | Pokud je kontextový prvek platný, GetExpectedParticles vrátí posloupnost prvků očekávaných jako podřízené položky kontextového prvku. Pokud je kontextový prvek neplatný, GetExpectedParticles vrátí prázdné pole. |
Pokud je kontextový prvek platný a pokud nebyl dříve proveden žádný volání ValidateAttribute , GetExpectedAttributes vrátí seznam všech atributů definovaných v elementu context. Pokud již byly některé atributy ověřeny, vrátí seznam zbývajících atributů, GetExpectedAttributes které se mají ověřit. Pokud je kontextový prvek neplatný, GetExpectedAttributes vrátí prázdné pole. |
Platí to samé jako výše. |
ValidateAttribute | Pokud je kontextovým atributem atribut nejvyšší úrovně, GetExpectedParticles vrátí prázdné pole. V opačném případě GetExpectedParticles vrátí posloupnost prvků očekávaných jako první podřízený prvek kontextu. |
Pokud je kontextovým atributem atribut nejvyšší úrovně, GetExpectedAttributes vrátí prázdné pole. V opačném případě GetExpectedAttributes vrátí seznam zbývajících atributů, které se mají ověřit. |
Platí to samé jako výše. |
GetUnspecifiedDefaultAttributes | GetExpectedParticles vrátí posloupnost prvků očekávaných jako první podřízený prvek kontextu. | GetExpectedAttributes vrátí seznam požadovaných a nepovinných atributů, které se ještě mají ověřit pro kontextový prvek. | Platí to samé jako výše. |
ValidateEndOfAttributes | GetExpectedParticles vrátí posloupnost prvků očekávaných jako první podřízený prvek kontextu. | GetExpectedAttributes vrátí prázdnou matici. | Platí to samé jako výše. |
ValidateText | Pokud je contentType kontextového prvku smíšený, GetExpectedParticles vrátí posloupnost prvků očekávaných v další pozici. Pokud je contentType kontextového prvku TextOnly nebo Empty, GetExpectedParticles vrátí prázdné pole. Pokud je contentType elementu kontextu ElementOnly, vrátí posloupnost prvků očekávaných na další pozici, GetExpectedParticles ale došlo k chybě ověření. |
GetExpectedAttributes vrátí seznam atributů, které nejsou ověřeny kontextovým prvkem. | Platí to samé jako výše. |
ValidateWhitespace | Pokud je kontext prázdný znak na nejvyšší úrovni prázdný, GetExpectedParticles vrátí prázdné pole. GetExpectedParticles Jinak chování metody je stejné jako v ValidateText. |
Pokud je kontext prázdný znak na nejvyšší úrovni prázdný, GetExpectedAttributes vrátí prázdné pole. GetExpectedAttributes Jinak chování metody je stejné jako v ValidateText. |
Platí to samé jako výše. |
ValidateEndElement | GetExpectedParticles vrátí sekvenci prvků očekávaných za kontextový prvek (možné elementy na stejné úrovni). | GetExpectedAttributes vrátí seznam atributů, které nejsou ověřeny kontextovým prvkem. Pokud kontextový prvek nemá žádný nadřazený prvek, GetExpectedAttributes vrátí prázdný seznam (kontextový prvek je nadřazený aktuální prvek, na kterém ValidateEndElement byl volána). |
Platí to samé jako výše. |
SkipToEndElement | Stejné jako ValidateEndElement. | Stejné jako ValidateEndElement. | Platí to samé jako výše. |
EndValidation | Vrátí prázdnou matici. | Vrátí prázdnou matici. | Platí to samé jako výše. |
Poznámka:
Hodnoty vrácené různými vlastnostmi XmlSchemaValidator třídy nejsou změněny voláním žádné z metod v předchozí tabulce.