Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Klassen XmlSchemaValidator tillhandahåller en effektiv mekanism med höga prestanda för att validera XML-data mot XML-scheman på ett push-baserat sätt. Med klassen kan du till exempel XmlSchemaValidator verifiera en XML-informationsuppsättning på plats utan att behöva serialisera den som ett XML-dokument och sedan skicka dokumentet igen med en validerande XML-läsare.
Klassen XmlSchemaValidator kan användas i avancerade scenarier som att skapa valideringsmotorer över anpassade XML-datakällor eller som ett sätt att skapa en validerande XML-skrivare.
Följande är ett exempel på hur du använder XmlSchemaValidator klassen för att verifiera contosoBooks.xml filen mot contosoBooks.xsd schemat. I exemplet används XmlSerializer klassen för att deserialisera contosoBooks.xml filen och skicka värdet för noderna till klassmetoderna XmlSchemaValidator .
Anmärkning
Det här exemplet används genomgående i olika delar av detta ämne.
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
Exemplet tar contosoBooks.xml-filen som indata.
<?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>
Exemplet tar contosoBooks.xsd också som indata.
<?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>
Validera XML-data med XmlSchemaValidator
Om du vill börja verifiera en XML-informationsuppsättning måste du först initiera en ny instans av XmlSchemaValidator klassen med konstruktorn XmlSchemaValidator .
Konstruktorn XmlSchemaValidator tar XmlNameTable, XmlSchemaSetoch XmlNamespaceManager objekt som parametrar samt ett XmlSchemaValidationFlags värde som en parameter. Objektet XmlNameTable används för att atomisera välkända namnområdessträngar som schemanamnområdet, XML-namnområdet och så vidare, och skickas till ParseValue metoden samtidigt som enkelt innehåll verifieras. Objektet XmlSchemaSet innehåller DE XML-scheman som används för att verifiera XML-informationsuppsättningen. Objektet XmlNamespaceManager används för att matcha namnområden som påträffades under valideringen. Värdet XmlSchemaValidationFlags används för att inaktivera vissa valideringsfunktioner.
Mer information om XmlSchemaValidator konstruktorn finns i dokumentationen för klassreferensen XmlSchemaValidator .
Initierar validering
När ett XmlSchemaValidator objekt har konstruerats finns det två överlagrade Initialize metoder som används för att initiera objektets XmlSchemaValidator tillstånd. Följande är de två Initialize metoderna.
XmlSchemaValidator.Initialize Standardmetoden initierar ett XmlSchemaValidator objekt till dess starttillstånd, och den överlagrade XmlSchemaValidator.Initialize metoden som tar en XmlSchemaObject som parameter initierar ett XmlSchemaValidator objekt till dess starttillstånd för partiell validering.
Båda Initialize metoderna kan bara anropas omedelbart efter att ett XmlSchemaValidator objekt har konstruerats eller efter ett anrop till EndValidation.
Ett exempel på XmlSchemaValidator.Initialize metoden finns i exemplet i introduktionen. För mer information om Initialize-metoden, se dokumentationen för klassreferensen XmlSchemaValidator.
Partiell validering
Metoden XmlSchemaValidator.Initialize som tar en XmlSchemaObject som parameter initierar ett XmlSchemaValidator objekt till dess starttillstånd för partiell validering.
I följande exempel initieras en XmlSchemaObject för partiell validering med hjälp av XmlSchemaValidator.Initialize metoden. Schemaelementet orderNumber skickas genom att välja schemaelementet i samlingen XmlQualifiedName som returneras av XmlSchemaObjectTable-egenskapen hos GlobalElements-objektet. Objektet XmlSchemaValidator verifierar sedan det här specifika elementet.
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);
I exemplet används följande XML-schema som indata.
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="orderNumber" type="xs:int" />
</xs:schema>
För mer information om Initialize-metoden, se dokumentationen för klassreferensen XmlSchemaValidator.
Lägga till ytterligare scheman
Metoden AddSchema för XmlSchemaValidator klassen används för att lägga till ett XML-schema i den uppsättning scheman som används under valideringen. Metoden AddSchema kan användas för att simulera effekten av att stöta på ett infogat XML-schema i XML-informationsuppsättningen som verifieras.
Anmärkning
Parameterns XmlSchema målnamnområde kan inte matcha det för element eller attribut som redan påträffas av XmlSchemaValidator objektet.
Om värdet XmlSchemaValidationFlags.ProcessInlineSchema inte skickades som en parameter till XmlSchemaValidator konstruktorn AddSchema gör metoden ingenting.
Resultatet av AddSchema-metoden är beroende av den aktuella XML-nodkontexten som valideras. Mer information om valideringskontexter finns i avsnittet "Valideringskontext" i det här avsnittet.
För mer information om AddSchema-metoden, se dokumentationen för klassreferensen XmlSchemaValidator.
Validera element, attribut och innehåll
Klassen XmlSchemaValidator innehåller flera metoder som används för att verifiera element, attribut och innehåll i en XML-informationsuppsättning mot XML-scheman. I följande tabell beskrivs var och en av dessa metoder.
| Metod | Beskrivning |
|---|---|
| ValidateElement | Verifierar elementnamnet i den aktuella kontexten. |
| ValidateAttribute | Validerar attributet i den aktuella elementkontexten eller mot objektet XmlSchemaAttribute som skickas som en parameter till Initialize metoden. |
| ValidateEndOfAttributes | Verifierar om alla obligatoriska attribut i elementkontexten finns och förbereder XmlSchemaValidator objektet för att verifiera elementets underordnade innehåll. |
| ValidateText | Verifierar om text tillåts i den aktuella elementkontexten och ackumulerar texten för validering om det aktuella elementet har enkelt innehåll. |
| ValidateWhitespace | Verifierar om blanksteg tillåts i den aktuella elementkontexten och ackumulerar tomt utrymme för validering om det aktuella elementet har enkelt innehåll. |
| ValidateEndElement | Verifierar om textinnehållet i elementet är giltigt enligt dess datatyp för element med enkelt innehåll och verifierar om innehållet i det aktuella elementet är komplett för element med komplext innehåll. |
| SkipToEndElement | Hoppar över valideringen av det aktuella elementinnehållet och förbereder XmlSchemaValidator objektet för att verifiera innehållet i det överordnade elementets kontext. |
| EndValidation | Avslutar verifieringen och kontrollerar identitetsbegränsningar för hela XML-dokumentet om valideringsalternativet ProcessIdentityConstraints har angetts. |
Anmärkning
Klassen XmlSchemaValidator har en definierad tillståndsövergång som framtvingar sekvensen och förekomsten av anrop som görs till var och en av de metoder som beskrivs i föregående tabell. Den specifika tillståndsövergången för XmlSchemaValidator klassen beskrivs i avsnittet "XmlSchemaValidator State Transition" i det här avsnittet.
Ett exempel på de metoder som används för att validera element, attribut och innehåll i en XML-informationsuppsättning finns i exemplet i föregående avsnitt. Mer information om dessa metoder finns i dokumentationen för klassreferensen XmlSchemaValidator .
Verifiera innehåll med hjälp av en XmlValueGetter
XmlValueGetter
delegate Kan användas för att skicka värdet för attribut-, text- eller blankstegsnoder som en CLR-typ (Common Language Runtime) som är kompatibel med XSD-typen (XML Schema Definition Language) för attributet, texten eller blankstegsnoden. En XmlValueGetterdelegate är användbart om CLR-värdet för ett attribut, text eller blankstegsnod redan är tillgängligt, och undviker kostnaden för att konvertera den till en string och sedan omparsa det igen för validering.
Metoderna ValidateAttribute, ValidateTextoch ValidateWhitespace är överbelastade och accepterar värdet för attribut-, text- eller blankstegsnoder som en string eller XmlValueGetterdelegate.
Följande metoder i XmlSchemaValidator klassen accepterar en XmlValueGetterdelegate som en parameter.
Följande är ett exempel XmlValueGetterdelegate som tas från XmlSchemaValidator klassexemplet i introduktionen.
XmlValueGetter
delegate Returnerar värdet för ett attribut som ett DateTime objekt. För att verifiera det här DateTime objektet som returneras av XmlValueGetterXmlSchemaValidatorkonverterar objektet det först till ValueType (ValueType är standard-CLR-mappning för XSD-typen) för datatypen för attributet och kontrollerar sedan fasetter på det konverterade värdet.
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);
}
Ett fullständigt exempel på XmlValueGetterdelegatefinns i exemplet i introduktionen. För mer information om XmlValueGetter och delegate, se XmlValueGetter och klassreferensdokumentationen XmlSchemaValidator.
Efter schemat -Validation-Information
Klassen XmlSchemaInfo representerar vissa av Post-Schema-Validation-Information för en XML-nod som valideras av klassen XmlSchemaValidator. Olika metoder i XmlSchemaValidator klassen accepterar ett XmlSchemaInfo objekt som en valfri parameter, (null). out
Vid lyckad validering anges egenskaperna för XmlSchemaInfo objektet med resultatet av valideringen. Vid lyckad validering av ett attribut med hjälp ValidateAttribute av metoden XmlSchemaInfo anges till exempel objektets (om det anges) SchemaAttribute, SchemaType, MemberTypeoch Validity egenskaperna med resultatet av valideringen.
Följande XmlSchemaValidator klassmetoder accepterar ett XmlSchemaInfo objekt som en out-parameter.
Ett fullständigt exempel på XmlSchemaInfo klassen finns i exemplet i introduktionen. Mer information om klassen finns i XmlSchemaInfo klassens XmlSchemaInfo referensdokumentation.
Hämtar förväntade partiklar, attribut och ospecificerade standardattribut
Klassen XmlSchemaValidator innehåller GetExpectedAttributesmetoderna , GetExpectedParticlesoch GetUnspecifiedDefaultAttributes för att hämta förväntade partiklar, attribut och ospecificerade standardattribut i den aktuella valideringskontexten.
Hämtar förväntade partiklar
Metoden GetExpectedParticles returnerar en matris med XmlSchemaParticle objekt som innehåller förväntade partiklar i den aktuella elementkontexten. De giltiga partiklar som kan returneras av GetExpectedParticles metoden är instanser av klasserna XmlSchemaElement och XmlSchemaAny .
När kompositorn för innehållsmodellen är en xs:sequence, returneras bara nästa partikel i sekvensen. Om sammansättningsmodellen för innehållsmodellen är en xs:all eller en xs:choicereturneras alla giltiga partiklar som kan följa i den aktuella elementkontexten.
Anmärkning
Om GetExpectedParticles-metoden anropas omedelbart efter att Initialize-metoden har anropats, returnerar GetExpectedParticles-metoden alla globala element.
I det följande exemplet med xml-schemat i schemadefinitionsspråket (XSD) och tillhörande XML-dokument, blir book elementet den aktuella elementkontexten efter att elementet book har verifierats. Metoden GetExpectedParticles returnerar en matris som innehåller ett enda XmlSchemaElement objekt som representerar elementet title . När verifieringskontexten är elementet titleGetExpectedParticles returnerar metoden en tom matris.
GetExpectedParticles Om metoden anropas efter att elementet title har verifierats men innan elementet description har verifierats returneras en matris som innehåller ett enda XmlSchemaElement objekt som representerar elementetdescription.
GetExpectedParticles Om metoden anropas efter att elementet description har verifierats returneras en matris som innehåller ett enda XmlSchemaAny objekt som representerar jokertecknet.
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);
Exemplet använder följande XML som indata:
<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>
I exemplet används följande XSD-schema som indata:
<book>
<title>My Book</title>
<description>My Book's Description</description>
<namespace>System.Xml.Schema</namespace>
</book>
Anmärkning
Resultatet av GetExpectedParticles- och GetExpectedAttributesAddSchema -metoderna för XmlSchemaValidator klassen är beroende av den aktuella kontexten som verifieras. Mer information finns i avsnittet "Valideringskontext" i det här avsnittet.
Ett exempel på GetExpectedParticles metoden finns i exemplet i introduktionen. För mer information om GetExpectedParticles-metoden, se dokumentationen för klassreferensen XmlSchemaValidator.
Hämtar förväntade attribut
Metoden GetExpectedAttributes returnerar en matris med XmlSchemaAttribute objekt som innehåller de förväntade attributen i den aktuella elementkontexten.
I exemplet i introduktionen GetExpectedAttributes används metoden till exempel för att hämta alla attribut för elementet book .
Om du anropar GetExpectedAttributes metoden direkt efter ValidateElement metoden returneras alla attribut som kan visas i XML-dokumentet. Men om du anropar GetExpectedAttributes metoden efter ett eller flera anrop till ValidateAttribute metoden returneras de attribut som ännu inte har verifierats för det aktuella elementet.
Anmärkning
Resultatet av GetExpectedParticles- och GetExpectedAttributesAddSchema -metoderna för XmlSchemaValidator klassen är beroende av den aktuella kontexten som verifieras. Mer information finns i avsnittet "Valideringskontext" i det här avsnittet.
Ett exempel på GetExpectedAttributes metoden finns i exemplet i introduktionen. För mer information om GetExpectedAttributes-metoden, se dokumentationen för klassreferensen XmlSchemaValidator.
Hämtar ospecificerade standardattribut
Metoden GetUnspecifiedDefaultAttributes fyller det ArrayList angivna med XmlSchemaAttribute objekt för alla attribut med standardvärden som inte tidigare har verifierats genom ValidateAttribute-metoden inom elementets kontext. Metoden GetUnspecifiedDefaultAttributes ska anropas efter att metoden har anropats ValidateAttribute för varje attribut i elementkontexten. Metoden GetUnspecifiedDefaultAttributes ska användas för att fastställa vilka standardattribut som ska infogas i DET XML-dokument som verifieras.
För mer information om GetUnspecifiedDefaultAttributes-metoden, se dokumentationen för klassreferensen XmlSchemaValidator.
Hantera schemavalideringshändelser
Schemavalideringsvarningar och fel som påträffas under valideringen hanteras av ValidationEventHandler händelsen för XmlSchemaValidator klassen.
Schemavalideringsvarningar har ett XmlSeverityType värde av Warning och schemavalideringsfel har ett XmlSeverityType värde av Error. Om inget ValidationEventHandler har tilldelats genereras en XmlSchemaValidationException för alla schemavalideringsfel med ett XmlSeverityType-värde på Error. En XmlSchemaValidationException genereras dock inte för schemavalideringsvarningar med ett XmlSeverityType-värde av Warning.
Följande är ett exempel på ett ValidationEventHandler som tar emot schemavalideringsvarningar och fel som påträffas under schemavalidering från exemplet i introduktionen.
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;
}
}
Ett fullständigt exempel på ValidationEventHandlerfinns i exemplet i introduktionen. Mer information finns i dokumentationen för XmlSchemaInfo klassreferensen.
XmlSchemaValidator-tillståndsövergång
Klassen XmlSchemaValidator har en definierad tillståndsövergång som framtvingar sekvensen och förekomsten av anrop som görs till var och en av de metoder som används för att verifiera element, attribut och innehåll i en XML-informationsuppsättning.
I följande tabell beskrivs statusövergången för XmlSchemaValidator klassen och sekvensen och förekomsten av metodanrop som kan göras i varje tillstånd.
| Stat/län | Övergång |
|---|---|
| Validera | Initialize ( |ValidateAttribute TopLevel*) EndValidation |
| Toppnivå | ValidateWhitespace | ValidateText | Element |
| Komponent |
ValidateElement
ValidateAttribute* (ValidateEndOfAttributes Innehåll*)? ValidateEndElement | ValidateElement ValidateAttribute * SkipToEndElement | ValidateElement ValidateAttribute * ValidateEndOfAttributes Innehåll* SkipToEndElement | |
| Innehåll | ValidateWhitespace | ValidateText | Element |
Anmärkning
En InvalidOperationException genereras av var och en av metoderna i tabellen ovan när anropet till metoden görs i fel sekvens enligt det aktuella tillståndet hos ett XmlSchemaValidator-objekt.
Tabellen för tillståndsövergång ovan använder skiljetecken för att beskriva de metoder och andra tillstånd som kan anropas för varje tillstånd i klassens XmlSchemaValidator tillståndsövergång. De symboler som används är samma symboler som finns i XML-standardreferensen för DTD (Document Type Definition).
I följande tabell beskrivs hur skiljetecken som finns i tabellen för tillståndsövergång ovan påverkar de metoder och andra tillstånd som kan anropas för varje tillstånd i tillståndsövergången för XmlSchemaValidator klassen.
| Symbol | Beskrivning |
|---|---|
| | | Metod eller tillstånd (den före strecket eller efter det) kan båda anropas. |
| ? | Metoden eller tillståndet som föregår frågetecknet är valfritt, men om det anropas kan det bara anropas en gång. |
| * | Den metod eller det tillstånd som föregår *-symbolen är valfri och kan anropas mer än en gång. |
Valideringskontext
Metoderna för klassen XmlSchemaValidator som används för att verifiera element, attribut och innehåll i en XML-informationsuppsättning ändrar valideringskontexten för ett XmlSchemaValidator objekt. Metoden SkipToEndElement hoppar till exempel över valideringen av innehållet i det aktuella elementet och förbereder objektet XmlSchemaValidator för att validera innehållet i det överordnade elementets kontext; det motsvarar att hoppa över valideringen för alla underordnade element i det aktuella elementet och sedan anropa metoden ValidateEndElement.
Resultatet av GetExpectedParticles- och GetExpectedAttributesAddSchema -metoderna för XmlSchemaValidator klassen är beroende av den aktuella kontexten som verifieras.
I följande tabell beskrivs resultatet av att anropa dessa metoder efter att ha anropat någon av metoderna i klassen XmlSchemaValidator som används för att validera element, attribut och innehåll i en XML-informationsuppsättning.
| Metod | HämtaFörväntadePartiklar | HämtaFörväntadeAttribut | AddSchema |
|---|---|---|---|
| Initialize | Om standardmetoden Initialize anropas GetExpectedParticles returnerar en matris som innehåller alla globala element. Om den överlagrade Initialize metoden som tar en XmlSchemaObject som parameter anropas för att initiera partiell validering av ett element GetExpectedParticles returnerar endast det element som XmlSchemaValidator objektet initierades till. |
Om standardmetoden Initialize anropas GetExpectedAttributes returnerar en tom matris. Om överlagringen av metoden Initialize som tar en XmlSchemaObject som parameter anropas för att initiera partiell validering av ett attribut returnerar GetExpectedAttributes endast det attribut som XmlSchemaValidator objektet initierades till. |
Lägger till schemat i XmlSchemaSetXmlSchemaValidator objektet om det inte har några förbearbetningsfel. |
| ValidateElement | Om kontextelementet är giltigt GetExpectedParticles returnerar sekvensen av element som förväntas som underordnade till kontextelementet. Om kontextelementet är ogiltigt GetExpectedParticles returnerar en tom matris. |
Om kontextelementet är giltigt, och om inget anrop har ValidateAttribute gjorts tidigare, GetExpectedAttributes returnerar en lista över alla attribut som definierats för kontextelementet. Om vissa attribut redan har verifierats GetExpectedAttributes returnerar en lista över de återstående attribut som ska verifieras. Om kontextelementet är ogiltigt GetExpectedAttributes returnerar en tom matris. |
Samma som ovan. |
| ValidateAttribute | Om kontextattributet är ett toppnivåattribut GetExpectedParticles returnerar en tom matris. Annars returnerar GetExpectedParticles sekvensen av element som förväntas vara det första underordnade till kontextelementet. |
Om kontextattributet är ett toppnivåattribut GetExpectedAttributes returnerar en tom matris. Annars GetExpectedAttributes returneras listan över återstående attribut som ska valideras. |
Samma som ovan. |
| GetUnspecifiedDefaultAttributes | GetExpectedParticles returnerar sekvensen av element som förväntas vara det första barnet till kontextelementet. | GetExpectedAttributes returnerar en lista över obligatoriska och valfria attribut som ännu inte har verifierats för kontextelementet. | Samma som ovan. |
| ValidateEndOfAttributes | GetExpectedParticles returnerar sekvensen av element som förväntas vara det första barnet till kontextelementet. | GetExpectedAttributes returnerar en tom matris. | Samma som ovan. |
| ValidateText | Om kontextelementets contentType är Mixed GetExpectedParticles returnerar sekvensen med element som förväntas i nästa position. Om context-elementets contentType är TextOnly eller Empty returnerar GetExpectedParticles en tom matris. Om kontextelementets contentType är ElementOnly returnerar GetExpectedParticles sekvensen med element som förväntas i nästa position, men ett verifieringsfel har redan inträffat. |
GetExpectedAttributes returnerar kontextelementets lista över attribut som inte har verifierats. | Samma som ovan. |
| ValidateWhitespace | Om blanksteget för kontexten är blanksteg på den översta nivån GetExpectedParticles returnerar en tom matris. Annars är metodens GetExpectedParticles beteende detsamma som i ValidateText. |
Om blanksteget för kontexten är blanksteg på den översta nivån GetExpectedAttributes returnerar en tom matris. Annars är metodens GetExpectedAttributes beteende detsamma som i ValidateText. |
Samma som ovan. |
| ValidateEndElement | GetExpectedParticles returnerar sekvensen av element som förväntas efter kontextelementet (möjliga syskon). |
GetExpectedAttributes returnerar kontextelementets lista över attribut som inte har verifierats. Om kontextelementet inte har någon överordnad returnerar en GetExpectedAttributes tom lista (kontextelementet är överordnat för det aktuella element som ValidateEndElement anropades). |
Samma som ovan. |
| SkipToEndElement | Samma som ValidateEndElement. | Samma som ValidateEndElement. | Samma som ovan. |
| EndValidation | Returnerar ett tomt fält. | Returnerar ett tomt fält. | Samma som ovan. |
Anmärkning
Värdena som returneras av de olika egenskaperna för XmlSchemaValidator klassen ändras inte genom att någon av metoderna i tabellen ovan anropas.