Schemaverifiering med XPathNavigator
Med hjälp av XmlDocument klassen kan du verifiera XML-innehållet i ett XmlDocument objekt på två sätt. Det första sättet är att verifiera XML-innehållet med ett valideringsobjekt XmlReader och det andra sättet är att använda Validate -metoden för XmlDocument klassen. Du kan också utföra skrivskyddad validering av XML-innehåll med hjälp av XPathDocument klassen .
Validera XML-data
Klassen XmlDocument validerar inte ett XML-dokument med antingen DTD- eller XML-schemadefinitionsspråk (XSD) schemavalidering som standard. Det verifierar bara att XML-dokumentet är välformat.
Det första sättet att verifiera ett XML-dokument är att verifiera dokumentet när det läses in i ett XmlDocument objekt med ett valideringsobjekt XmlReader . Det andra sättet är att verifiera ett tidigare otypat XML-dokument med hjälp Validate av klassens XmlDocument metod. I båda fallen kan ändringar i det verifierade XML-dokumentet återkallas med hjälp Validate av -klassens XmlDocument metod.
Verifiera ett dokument när det läses in
Ett verifierande XmlReader objekt skapas genom att ett XmlReaderSettings objekt skickas till Create -metoden för klassen XmlReader som tar ett XmlReaderSettings objekt som en parameter. Objektet XmlReaderSettings som skickas som en parameter har en ValidationType egenskap inställd på Schema
och ett XML-schema för XML-dokumentet som finns i objektet XmlDocument som lagts till i dess Schemas egenskap. Det verifierande XmlReader objektet används sedan för att skapa objektet XmlDocument .
I följande exempel verifieras filen när den contosoBooks.xml
XmlDocument läses in i objektet genom att objektet skapas XmlDocument med ett verifierande XmlReader objekt. Eftersom XML-dokumentet är giltigt enligt schemat genereras inga schemavalideringsfel eller varningar.
Imports System
Imports System.Xml
Imports System.Xml.Schema
Imports System.Xml.XPath
Class ValidatingReaderExample
Shared Sub Main(ByVal args() As String)
Try
Dim settings As XmlReaderSettings = New XmlReaderSettings()
settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd")
settings.ValidationType = ValidationType.Schema
Dim reader As XmlReader = XmlReader.Create("contosoBooks.xml", settings)
Dim document As XmlDocument = New XmlDocument()
document.Load(reader)
Dim navigator As XPathNavigator = document.CreateNavigator()
Catch e As Exception
Console.WriteLine("ValidatingReaderExample.Exception: {0}", e.Message)
End Try
End Sub
Shared Sub SchemaValidationHandler(ByVal sender As Object, ByVal e As ValidationEventArgs)
Select Case e.Severity
Case XmlSeverityType.Error
Console.WriteLine("Schema Validation Error: {0}", e.Message)
Exit Sub
Case XmlSeverityType.Warning
Console.WriteLine("Schema Validation Warning: {0}", e.Message)
Exit Sub
End Select
End Sub
End Class
using System;
using System.Xml;
using System.Xml.Schema;
using System.Xml.XPath;
class ValidatingReaderExample
{
static void Main(string[] args)
{
try
{
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd");
settings.ValidationType = ValidationType.Schema;
XmlReader reader = XmlReader.Create("contosoBooks.xml", settings);
XmlDocument document = new XmlDocument();
document.Load(reader);
XPathNavigator navigator = document.CreateNavigator();
}
catch (Exception e)
{
Console.WriteLine("ValidatingReaderExample.Exception: {0}", e.Message);
}
}
static void SchemaValidationHandler(object sender, ValidationEventArgs e)
{
switch (e.Severity)
{
case XmlSeverityType.Error:
Console.WriteLine("Schema Validation Error: {0}", e.Message);
break;
case XmlSeverityType.Warning:
Console.WriteLine("Schema Validation Warning: {0}", e.Message);
break;
}
}
}
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>
I exemplet ovan utlöses en XmlSchemaValidationException när Load anropas om någon attribut- eller elementtyp inte matchar motsvarande typ som anges i valideringsschemat. Om en ValidationEventHandler har angetts för valideringen XmlReaderValidationEventHandler anropas den när en ogiltig typ påträffas.
Ett XmlSchemaException genereras när ett attribut eller element med TypedValue inställt på invalid
används av XPathNavigator.
Egenskapen Validity kan användas för att avgöra om ett enskilt attribut eller element är giltigt vid åtkomst till attribut eller element med XPathNavigator.
Kommentar
När ett XML-dokument läses in i ett XmlDocument objekt med ett associerat schema som definierar standardvärden behandlar XmlDocument objektet dessa standardvärden som om de visades i XML-dokumentet. Det innebär att IsEmptyElement egenskapen alltid returnerar false
för ett element som har standardinställningen från schemat, även om den i XML-dokumentet skrevs som ett tomt element.
Verifiera ett dokument med hjälp av valideringsmetoden
Metoden Validate för XmlDocument klassen validerar XML-dokumentet som finns i ett XmlDocument objekt mot de scheman som anges i XmlDocument objektets Schemas egenskap och utför infouppsättningsförstoring. Resultatet är ett tidigare otypat XML-dokument i objektet XmlDocument som ersatts med ett skrivet dokument.
Objektet XmlDocument rapporterar schemaverifieringsfel och varningar med hjälp av ombudet ValidationEventHandler som skickas som en parameter till Validate metoden.
I följande exempel verifieras contosoBooks.xml
filen som finns i XmlDocument objektet mot schemat contosoBooks.xsd
som finns i XmlDocument objektets Schemas egenskap.
Imports System
Imports System.Xml
Imports System.Xml.Schema
Imports System.Xml.XPath
Class ValidateExample
Shared Sub Main(ByVal args() As String)
Dim document As XmlDocument = New XmlDocument()
document.Load("contosoBooks.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()
document.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd")
Dim validation As ValidationEventHandler = New ValidationEventHandler(AddressOf SchemaValidationHandler)
document.Validate(validation)
End Sub
Shared Sub SchemaValidationHandler(ByVal sender As Object, ByVal e As ValidationEventArgs)
Select Case e.Severity
Case XmlSeverityType.Error
Console.WriteLine("Schema Validation Error: {0}", e.Message)
Exit Sub
Case XmlSeverityType.Warning
Console.WriteLine("Schema Validation Warning: {0}", e.Message)
Exit Sub
End Select
End Sub
End Class
using System;
using System.Xml;
using System.Xml.Schema;
using System.Xml.XPath;
class ValidateExample
{
static void Main(string[] args)
{
XmlDocument document = new XmlDocument();
document.Load("contosoBooks.xml");
XPathNavigator navigator = document.CreateNavigator();
document.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd");
ValidationEventHandler validation = new ValidationEventHandler(SchemaValidationHandler);
document.Validate(validation);
}
static void SchemaValidationHandler(object sender, ValidationEventArgs e)
{
switch (e.Severity)
{
case XmlSeverityType.Error:
Console.WriteLine("Schema Validation Error: {0}", e.Message);
break;
case XmlSeverityType.Warning:
Console.WriteLine("Schema Validation Warning: {0}", e.Message);
break;
}
}
}
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 ändringar
När ändringar har gjorts i ett XML-dokument kan du verifiera ändringarna mot schemat för XML-dokumentet med hjälp Validate av -metoden för XmlDocument klassen.
I följande exempel verifieras filen när den contosoBooks.xml
XmlDocument läses in i objektet genom att objektet skapas XmlDocument med ett verifierande XmlReader objekt. XML-dokumentet verifieras när det läses in utan att några schemavalideringsfel eller varningar genereras. Exemplet gör sedan två ändringar i XML-dokumentet som är ogiltiga enligt contosoBooks.xsd
schemat. Den första ändringen infogar ett ogiltigt underordnat element som resulterar i ett schemaverifieringsfel, och den andra ändringen anger värdet för en typad nod till ett värde som är ogiltigt enligt nodens typ, vilket resulterar i ett undantag.
Imports System
Imports System.Xml
Imports System.Xml.Schema
Imports System.Xml.XPath
Class ValidatingReaderExample
Shared Sub Main(ByVal args() As String)
Try
Dim settings As XmlReaderSettings = New XmlReaderSettings()
settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd")
settings.ValidationType = ValidationType.Schema
Dim reader As XmlReader = XmlReader.Create("contosoBooks.xml", settings)
Dim document As XmlDocument = New XmlDocument()
document.Load(reader)
Dim navigator As XPathNavigator = document.CreateNavigator()
Dim validation As ValidationEventHandler = New ValidationEventHandler(AddressOf SchemaValidationHandler)
navigator.MoveToChild("bookstore", "http://www.contoso.com/books")
navigator.MoveToChild("book", "http://www.contoso.com/books")
navigator.MoveToChild("author", "http://www.contoso.com/books")
navigator.AppendChild("<title>Book Title</title>")
document.Validate(validation)
navigator.MoveToParent()
navigator.MoveToChild("price", "http://www.contoso.com/books")
navigator.SetTypedValue(DateTime.Now)
Catch e As Exception
Console.WriteLine("ValidatingReaderExample.Exception: {0}", e.Message)
End Try
End Sub
Shared Sub SchemaValidationHandler(ByVal sender As Object, ByVal e As ValidationEventArgs)
Select Case e.Severity
Case XmlSeverityType.Error
Console.WriteLine("Schema Validation Error: {0}", e.Message)
Exit Sub
Case XmlSeverityType.Warning
Console.WriteLine("Schema Validation Warning: {0}", e.Message)
Exit Sub
End Select
End Sub
End Class
using System;
using System.Xml;
using System.Xml.Schema;
using System.Xml.XPath;
class ValidatingReaderExample
{
static void Main(string[] args)
{
try
{
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd");
settings.ValidationType = ValidationType.Schema;
XmlReader reader = XmlReader.Create("contosoBooks.xml", settings);
XmlDocument document = new XmlDocument();
document.Load(reader);
XPathNavigator navigator = document.CreateNavigator();
ValidationEventHandler validation = new ValidationEventHandler(SchemaValidationHandler);
navigator.MoveToChild("bookstore", "http://www.contoso.com/books");
navigator.MoveToChild("book", "http://www.contoso.com/books");
navigator.MoveToChild("author", "http://www.contoso.com/books");
navigator.AppendChild("<title>Book Title</title>");
document.Validate(validation);
navigator.MoveToParent();
navigator.MoveToChild("price", "http://www.contoso.com/books");
navigator.SetTypedValue(DateTime.Now);
}
catch (Exception e)
{
Console.WriteLine("ValidatingReaderExample.Exception: {0}", e.Message);
}
}
static void SchemaValidationHandler(object sender, ValidationEventArgs e)
{
switch (e.Severity)
{
case XmlSeverityType.Error:
Console.WriteLine("Schema Validation Error: {0}", e.Message);
break;
case XmlSeverityType.Warning:
Console.WriteLine("Schema Validation Warning: {0}", e.Message);
break;
}
}
}
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>
I exemplet ovan görs två ändringar i XML-dokumentet som finns i XmlDocument objektet. När XML-dokumentet lästes in skulle eventuella schemavalideringsfel som påträffades ha hanterats av verifieringshändelsehanterarmetoden och skrivits till konsolen.
I det här exemplet introducerades verifieringsfelen efter att XML-dokumentet lästes in och hittades med hjälp Validate av -klassens XmlDocument metod.
Ändringar som gjorts med SetTypedValue metoden XPathNavigator för klassen resulterade i en InvalidCastException eftersom det nya värdet var ogiltigt enligt nodens schematyp.
Mer information om hur du ändrar värden med hjälp av SetTypedValue metoden finns i avsnittet Ändra XML-data med XPathNavigator .
Skrivskyddad validering
Klassen XPathDocument är en skrivskyddad minnesintern representation av ett XML-dokument. XPathDocument Både klassen och XmlDocument klassen skapar XPathNavigator objekt för att navigera och redigera XML-dokument. XPathDocument Eftersom klassen är en skrivskyddad klass kan XPathNavigator objektet som returneras från XPathDocument objekt inte redigera XML-dokumentet som finns i XPathDocument objektet.
När det gäller validering kan du skapa ett XPathDocument objekt precis som du skapar ett XmlDocument objekt med hjälp av ett valideringsobjekt XmlReader enligt beskrivningen tidigare i det här avsnittet. Objektet XPathDocument verifierar XML-dokumentet när det läses in, men eftersom du inte kan redigera XML-data i XPathDocument objektet kan du inte återskapa XML-dokumentet.
Mer information om skrivskyddade och redigerbara objekt finns XPathNavigator i artikeln Läsa XML-data med XPathDocument och XmlDocument .