Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
TřídaXmlDocument neověřuje XML v modelu DOM (Document Object Model) proti schématu XSD (XML Schema Definition Language) nebo definici typu dokumentu (DTD) ve výchozím nastavení; XML je ověřen pouze tak, aby byl správně formátován.
Pokud chcete ověřit XML v DOM, můžete jej ověřit během načítání do DOM pomocí schéma-validujícího XmlReader předaného metodě Load třídy XmlDocument, nebo můžete ověřit dříve neověřený dokument XML v DOM pomocí metody Validate třídy XmlDocument.
Ověřování dokumentu XML během jeho načítání do DOM
Třída XmlDocument ověřuje XML data při jejich načtení do DOM, když je ověřující XmlReader předán metodě Load třídy XmlDocument.
Po úspěšném ověření se použijí výchozí hodnoty schématu, textové hodnoty se podle potřeby převedou na atomické hodnoty a informace o typu jsou přidružené k ověřeným položkám informací. V důsledku toho typová data XML nahradí dříve nezatypovaná data XML.
Vytvoření XML Schema-Validating XmlReader
Chcete-li vytvořit validaci schématu XML XmlReader, postupujte takto.
Vytvořte novou instanci XmlReaderSettings.
Přidejte schéma XML do vlastnosti Schemas instance XmlReaderSettings.
Zadejte
Schemajako ValidationType.Volitelně můžete zadat ValidationFlags a ValidationEventHandler pro zpracování chyb a upozornění ověřování schématu, ke kterým došlo během ověřování.
Nakonec předejte objekt XmlReaderSettings do Create metody třídy XmlReader spolu s dokumentem XML a vytvořte XmlReaderověřování schématu .
Příklad
V následujícím příkladu kódu XmlReader, který ověřuje schéma, validuje XML data načtená do DOM. V dokumentu XML jsou provedeny neplatné změny a dokument se pak znovu aktualizuje, což způsobuje chyby ověření schématu. Nakonec se opraví jedna z chyb a část dokumentu XML se částečně ověří.
using System;
using System.Xml;
using System.Xml.Schema;
class XmlDocumentValidationExample
{
static void Main(string[] args)
{
try
{
// Create a schema validating XmlReader.
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd");
settings.ValidationEventHandler += new ValidationEventHandler(ValidationEventHandler);
settings.ValidationFlags = settings.ValidationFlags | XmlSchemaValidationFlags.ReportValidationWarnings;
settings.ValidationType = ValidationType.Schema;
XmlReader reader = XmlReader.Create("contosoBooks.xml", settings);
// The XmlDocument validates the XML document contained
// in the XmlReader as it is loaded into the DOM.
XmlDocument document = new XmlDocument();
document.Load(reader);
// Make an invalid change to the first and last
// price elements in the XML document, and write
// the XmlSchemaInfo values assigned to the price
// element during load validation to the console.
XmlNamespaceManager manager = new XmlNamespaceManager(document.NameTable);
manager.AddNamespace("bk", "http://www.contoso.com/books");
XmlNode priceNode = document.SelectSingleNode(@"/bk:bookstore/bk:book/bk:price", manager);
Console.WriteLine($"SchemaInfo.IsDefault: {priceNode.SchemaInfo.IsDefault}");
Console.WriteLine($"SchemaInfo.IsNil: {priceNode.SchemaInfo.IsNil}");
Console.WriteLine($"SchemaInfo.SchemaElement: {priceNode.SchemaInfo.SchemaElement}");
Console.WriteLine($"SchemaInfo.SchemaType: {priceNode.SchemaInfo.SchemaType}");
Console.WriteLine($"SchemaInfo.Validity: {priceNode.SchemaInfo.Validity}");
priceNode.InnerXml = "A";
XmlNodeList priceNodes = document.SelectNodes(@"/bk:bookstore/bk:book/bk:price", manager);
XmlNode lastprice = priceNodes[priceNodes.Count - 1];
lastprice.InnerXml = "B";
// Validate the XML document with the invalid changes.
// The invalid changes cause schema validation errors.
document.Validate(ValidationEventHandler);
// Correct the invalid change to the first price element.
priceNode.InnerXml = "8.99";
// Validate only the first book element. The last book
// element is invalid, but not included in validation.
XmlNode bookNode = document.SelectSingleNode(@"/bk:bookstore/bk:book", manager);
document.Validate(ValidationEventHandler, bookNode);
}
catch (XmlException ex)
{
Console.WriteLine($"XmlDocumentValidationExample.XmlException: {ex.Message}");
}
catch(XmlSchemaValidationException ex)
{
Console.WriteLine($"XmlDocumentValidationExample.XmlSchemaValidationException: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"XmlDocumentValidationExample.Exception: {ex.Message}");
}
}
static void ValidationEventHandler(object sender, System.Xml.Schema.ValidationEventArgs args)
{
if (args.Severity == XmlSeverityType.Warning)
Console.Write("\nWARNING: ");
else if (args.Severity == XmlSeverityType.Error)
Console.Write("\nERROR: ");
Console.WriteLine(args.Message);
}
}
Imports System.Xml
Imports System.Xml.Schema
Class XmlDocumentValidationExample
Shared Sub Main()
Try
' Create a schema validating XmlReader.
Dim settings As XmlReaderSettings = New XmlReaderSettings()
settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd")
AddHandler settings.ValidationEventHandler, New ValidationEventHandler(AddressOf ValidationEventHandler)
settings.ValidationFlags = settings.ValidationFlags And XmlSchemaValidationFlags.ReportValidationWarnings
settings.ValidationType = ValidationType.Schema
Dim reader As XmlReader = XmlReader.Create("contosoBooks.xml", settings)
' The XmlDocument validates the XML document contained
' in the XmlReader as it is loaded into the DOM.
Dim document As XmlDocument = New XmlDocument()
document.Load(reader)
' Make an invalid change to the first and last
' price elements in the XML document, and write
' the XmlSchemaInfo values assigned to the price
' element during load validation to the console.
Dim manager As XmlNamespaceManager = New XmlNamespaceManager(document.NameTable)
manager.AddNamespace("bk", "http://www.contoso.com/books")
Dim priceNode As XmlNode = document.SelectSingleNode("/bk:bookstore/bk:book/bk:price", manager)
Console.WriteLine("SchemaInfo.IsDefault: {0}", priceNode.SchemaInfo.IsDefault)
Console.WriteLine("SchemaInfo.IsNil: {0}", priceNode.SchemaInfo.IsNil)
Console.WriteLine("SchemaInfo.SchemaElement: {0}", priceNode.SchemaInfo.SchemaElement)
Console.WriteLine("SchemaInfo.SchemaType: {0}", priceNode.SchemaInfo.SchemaType)
Console.WriteLine("SchemaInfo.Validity: {0}", priceNode.SchemaInfo.Validity)
priceNode.InnerXml = "A"
Dim priceNodes As XmlNodeList = document.SelectNodes("/bk:bookstore/bk:book/bk:price", manager)
Dim lastprice As XmlNode = priceNodes(priceNodes.Count - 1)
lastprice.InnerXml = "B"
' Validate the XML document with the invalid changes.
' The invalid changes cause schema validation errors.
document.Validate(AddressOf ValidationEventHandler)
' Correct the invalid change to the first price element.
priceNode.InnerXml = "8.99"
' Validate only the first book element. The last book
' element is invalid, but not included in validation.
Dim bookNode As XmlNode = document.SelectSingleNode("/bk:bookstore/bk:book", manager)
document.Validate(AddressOf ValidationEventHandler, bookNode)
Catch ex As XmlException
Console.WriteLine("XmlDocumentValidationExample.XmlException: {0}", ex.Message)
Catch ex As XmlSchemaValidationException
Console.WriteLine("XmlDocumentValidationExample.XmlSchemaValidationException: {0}", ex.Message)
Catch ex As Exception
Console.WriteLine("XmlDocumentValidationExample.Exception: {0}", ex.Message)
End Try
End Sub
Shared Sub ValidationEventHandler(ByVal sender As Object, ByVal args As ValidationEventArgs)
If args.Severity = XmlSeverityType.Warning Then
Console.Write(vbCrLf & "WARNING: ")
Else
If args.Severity = XmlSeverityType.Error Then
Console.Write(vbCrLf & "ERROR: ")
End If
End If
Console.WriteLine(args.Message)
End Sub
End Class
Příklad přebírá 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é vezme contosoBooks.xsd soubor 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>
Při ověřování dat XML při načítání do DOM zvažte následující skutečnosti.
V předchozím příkladu je ValidationEventHandler volána vždy, když je zjištěn neplatný typ. Pokud ValidationEventHandler není nastaven na validující XmlReader, XmlSchemaValidationException je vyvolána při volání Load, pokud nějaký atribut nebo typ prvku neodpovídá typu v ověřovacím schématu.
Při načtení dokumentu XML do objektu XmlDocument s přidruženým schématem, které definuje výchozí hodnoty, XmlDocument považuje tyto výchozí hodnoty za předpokladu, že se zobrazí v dokumentu XML. To znamená, že vlastnost IsEmptyElement vždy vrací
falsepro prvek, který byl výchozí ze schématu. I přestože je v dokumentu XML zapsán jako prázdný prvek.
Ověření dokumentu XML v DOM
Metoda Validate třídy XmlDocument ověřuje data XML načtená v modelu DOM proti schématům ve vlastnosti XmlDocument objektu Schemas. Po úspěšném ověření se použijí výchozí hodnoty schématu, textové hodnoty se podle potřeby převedou na atomické hodnoty a informace o typu jsou přidružené k ověřeným položkám informací. V důsledku toho typová data XML nahradí dříve nezatypovaná data XML.
Následující příklad je podobný příkladu v části "Ověřování dokumentu XML při načtení do DOM" výše. V tomto příkladu se dokument XML neověřuje při načítání do DOM, ale ověří se až po načtení do DOM pomocí metody Validate třídy XmlDocument. Metoda Validate ověří dokument XML proti schématům XML obsaženým ve vlastnosti SchemasXmlDocument. V dokumentu XML se pak provede neplatné úpravy a dokument se pak znovu aktualizuje, což způsobí chyby ověření schématu. Nakonec se opraví jedna z chyb a část dokumentu XML se částečně ověří.
using System;
using System.Xml;
using System.Xml.Schema;
class XmlDocumentValidationExample
{
static void Main(string[] args)
{
try
{
// Create a new XmlDocument instance and load
// the XML document into the DOM.
XmlDocument document = new XmlDocument();
document.Load("contosoBooks.xml");
// Add the XML schema for the XML document to the
// Schemas property of the XmlDocument.
document.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd");
// Validate the XML document loaded into the DOM.
document.Validate(ValidationEventHandler);
// Make an invalid change to the first and last
// price elements in the XML document, and write
// the XmlSchemaInfo values assigned to the price
// element during validation to the console.
XmlNamespaceManager manager = new XmlNamespaceManager(document.NameTable);
manager.AddNamespace("bk", "http://www.contoso.com/books");
XmlNode priceNode = document.SelectSingleNode(@"/bk:bookstore/bk:book/bk:price", manager);
Console.WriteLine($"SchemaInfo.IsDefault: {priceNode.SchemaInfo.IsDefault}");
Console.WriteLine($"SchemaInfo.IsNil: {priceNode.SchemaInfo.IsNil}");
Console.WriteLine($"SchemaInfo.SchemaElement: {priceNode.SchemaInfo.SchemaElement}");
Console.WriteLine($"SchemaInfo.SchemaType: {priceNode.SchemaInfo.SchemaType}");
Console.WriteLine($"SchemaInfo.Validity: {priceNode.SchemaInfo.Validity}");
priceNode.InnerXml = "A";
XmlNodeList priceNodes = document.SelectNodes(@"/bk:bookstore/bk:book/bk:price", manager);
XmlNode lastprice = priceNodes[priceNodes.Count - 1];
lastprice.InnerXml = "B";
// Validate the XML document with the invalid changes.
// The invalid changes cause schema validation errors.
document.Validate(ValidationEventHandler);
// Correct the invalid change to the first price element.
priceNode.InnerXml = "8.99";
// Validate only the first book element. The last book
// element is invalid, but not included in validation.
XmlNode bookNode = document.SelectSingleNode(@"/bk:bookstore/bk:book", manager);
document.Validate(ValidationEventHandler, bookNode);
}
catch (XmlException ex)
{
Console.WriteLine($"XmlDocumentValidationExample.XmlException: {ex.Message}");
}
catch(XmlSchemaValidationException ex)
{
Console.WriteLine($"XmlDocumentValidationExample.XmlSchemaValidationException: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"XmlDocumentValidationExample.Exception: {ex.Message}");
}
}
static void ValidationEventHandler(object sender, System.Xml.Schema.ValidationEventArgs args)
{
if (args.Severity == XmlSeverityType.Warning)
Console.Write("\nWARNING: ");
else if (args.Severity == XmlSeverityType.Error)
Console.Write("\nERROR: ");
Console.WriteLine(args.Message);
}
}
Imports System.Xml
Imports System.Xml.Schema
Class XmlDocumentValidationExample
Shared Sub Main()
Try
' Create a new XmlDocument instance and load
' the XML document into the DOM.
Dim document As XmlDocument = New XmlDocument()
document.Load("contosoBooks.xml")
' Add the XML schema for the XML document to the
' Schemas property of the XmlDocument.
document.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd")
' Validate the XML document loaded into the DOM.
document.Validate(AddressOf ValidationEventHandler)
' Make an invalid change to the first and last
' price elements in the XML document, and write
' the XmlSchemaInfo values assigned to the price
' element during validation to the console.
Dim manager As XmlNamespaceManager = New XmlNamespaceManager(document.NameTable)
manager.AddNamespace("bk", "http://www.contoso.com/books")
Dim priceNode As XmlNode = document.SelectSingleNode("/bk:bookstore/bk:book/bk:price", manager)
Console.WriteLine("SchemaInfo.IsDefault: {0}", priceNode.SchemaInfo.IsDefault)
Console.WriteLine("SchemaInfo.IsNil: {0}", priceNode.SchemaInfo.IsNil)
Console.WriteLine("SchemaInfo.SchemaElement: {0}", priceNode.SchemaInfo.SchemaElement)
Console.WriteLine("SchemaInfo.SchemaType: {0}", priceNode.SchemaInfo.SchemaType)
Console.WriteLine("SchemaInfo.Validity: {0}", priceNode.SchemaInfo.Validity)
priceNode.InnerXml = "A"
Dim priceNodes As XmlNodeList = document.SelectNodes("/bk:bookstore/bk:book/bk:price", manager)
Dim lastprice As XmlNode = priceNodes(priceNodes.Count - 1)
lastprice.InnerXml = "B"
' Validate the XML document with the invalid changes.
' The invalid changes cause schema validation errors.
document.Validate(AddressOf ValidationEventHandler)
' Correct the invalid change to the first price element.
priceNode.InnerXml = "8.99"
' Validate only the first book element. The last book
' element is invalid, but not included in validation.
Dim bookNode As XmlNode = document.SelectSingleNode("/bk:bookstore/bk:book", manager)
document.Validate(AddressOf ValidationEventHandler, bookNode)
Catch ex As XmlException
Console.WriteLine("XmlDocumentValidationExample.XmlException: {0}", ex.Message)
Catch ex As XmlSchemaValidationException
Console.WriteLine("XmlDocumentValidationExample.XmlSchemaValidationException: {0}", ex.Message)
Catch ex As Exception
Console.WriteLine("XmlDocumentValidationExample.Exception: {0}", ex.Message)
End Try
End Sub
Shared Sub ValidationEventHandler(ByVal sender As Object, ByVal args As ValidationEventArgs)
If args.Severity = XmlSeverityType.Warning Then
Console.Write(vbCrLf & "WARNING: ")
Else
If args.Severity = XmlSeverityType.Error Then
Console.Write(vbCrLf & "ERROR: ")
End If
End If
Console.WriteLine(args.Message)
End Sub
End Class
Příklad přebírá jako vstup soubory contosoBooks.xml a contosoBooks.xsd zmíněné v části "Ověřování dokumentu XML, jak je načten do DOM" výše.
Zpracování chyb ověřování a upozornění
Chyby ověření schématu XML se oznamují při ověřování dat XML načtených do DOM. Při ověřování dat XML při načítání nebo při ověřování dříve zastaralého dokumentu XML se zobrazí oznámení o všech nalezených chybách ověření schématu.
Chyby ověřování zpracovává ValidationEventHandler. Pokud ValidationEventHandler byla přiřazena k instanci XmlReaderSettings nebo předána metodě Validate třídy XmlDocument, ValidationEventHandler zpracuje chyby ověření schématu; v opačném případě je vyvolána XmlSchemaValidationException, pokud dojde k chybě ověření schématu.
Poznámka:
XML data se načtou do DOM i přes chyby při ověřování schématu, pokud ValidationEventHandler nevyvolá výjimku k zastavení procesu.
Upozornění na ověření schématu nejsou hlášena, pokud není pro objekt ReportValidationWarnings zadán příznak XmlReaderSettings.
Příklady ilustrující ValidationEventHandlerviz "Ověřování dokumentu XML při načtení do DOM" a "Ověření dokumentu XML v DOM" výše.