Sémaérvényesítés az XPathNavigator használatával
Az XmlDocument osztály használatával kétféleképpen ellenőrizheti az objektumban XmlDocument található XML-tartalmat. Az első módszer az XML-tartalom érvényesítése egy érvényesítő XmlReader objektummal, a második módszer pedig az ValidateXmlDocument osztály metódusának használata. Az osztály használatával XPathDocument az XML-tartalom írásvédett ellenőrzését is elvégezheti.
XML-adatok érvényesítése
Az XmlDocument osztály alapértelmezés szerint nem érvényesít egy XML-dokumentumot sem DTD, sem XML-sémadefiníciós nyelv (XSD) sémaérvényesítéssel. Csak azt ellenőrzi, hogy az XML-dokumentum megfelelően van-e formázva.
Az XML-dokumentumok érvényesítésének első módja a dokumentum ellenőrzése, mivel az egy érvényesítő XmlReader objektummal töltődik be egy XmlDocument objektumba. A második módszer egy korábban nem beírt XML-dokumentum ellenőrzése az ValidateXmlDocument osztály metódusával. Az ellenőrzött XML-dokumentum módosításai mindkét esetben újraértékelhetők az ValidateXmlDocument osztály metódusával.
Dokumentum ellenőrzése betöltve
Az érvényesítő XmlReader objektum úgy jön létre, hogy átad egy XmlReaderSettings objektumot annak az osztálynak a CreateXmlReader metódusának, amely paraméterként használ egy XmlReaderSettings objektumot. A XmlReaderSettings paraméterként ValidationType átadott objektumhoz egy tulajdonság van beállítva Schema
, valamint egy XML-séma az objektumban lévő XML-dokumentumhoz, amely hozzá lett adva a XmlDocument tulajdonságához Schemas . Ezután a rendszer az érvényesítő XmlReader objektumot használja az XmlDocument objektum létrehozásához.
Az alábbi példa ellenőrzi, hogy a contosoBooks.xml
fájl be van-e töltve az XmlDocument objektumba XmlDocument egy érvényesítő XmlReader objektum használatával. Mivel az XML-dokumentum a sémája szerint érvényes, nem jön létre sémaérvényesítési hiba vagy figyelmeztetés.
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;
}
}
}
A példa bemenetként használja a contosoBooks.xml
fájlt.
<?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>
A példa bemenetként contosoBooks.xsd
is szerepel.
<?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>
A fenti példában a rendszer akkor küldi XmlSchemaValidationException el a parancsot, ha Load bármely attribútum vagy elemtípus nem egyezik meg a érvényesítési sémában megadott megfelelő típussal. Ha a rendszer beállítja ValidationEventHandler az ellenőrzést XmlReader, a rendszer meghívja a ValidationEventHandler rendszer, amikor érvénytelen típust tapasztal.
A XmlSchemaException rendszer egy olyan attribútumot vagy elemet ad vissza, amelynek TypedValue beállított invalid
értéke a XPathNavigator.
A Validity tulajdonság segítségével meghatározhatja, hogy egy adott attribútum vagy elem érvényes-e az attribútumokhoz vagy elemekhez való hozzáféréskor.XPathNavigator
Feljegyzés
Ha egy XML-dokumentumot egy olyan társított sémával rendelkező objektumba XmlDocument tölt be, amely meghatározza az alapértelmezett értékeket, az objektum ezeket az XmlDocument alapértelmezett értékeket úgy kezeli, mintha azok megjelennének az XML-dokumentumban. Ez azt jelenti, hogy a IsEmptyElement tulajdonság mindig a sémából alapértelmezett elemhez ad vissza false
, még akkor is, ha az XML-dokumentumban üres elemként írták.
Dokumentum érvényesítése az Érvényesítési módszerrel
Az Validate osztály metódusa ellenőrzi az XmlDocument objektumban XmlDocument található XML-dokumentumot az XmlDocument objektum Schemas tulajdonságában megadott sémákkal szemben, és adathalmaz-bővítést hajt végre. Az eredmény egy korábban nem beírt XML-dokumentum az XmlDocument objektumban, amelyet gépelt dokumentumra cserélt.
Az XmlDocument objektum sémaérvényesítési hibákat és figyelmeztetéseket jelent a ValidationEventHandler metódus paramétereként Validate átadott delegált használatával.
Az alábbi példa ellenőrzi az contosoBooks.xml
objektumban XmlDocument található fájlt az contosoBooks.xsd
objektum Schemas tulajdonságában található sémával XmlDocument szemben.
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;
}
}
}
A példa bemenetként használja a contosoBooks.xml
fájlt.
<?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>
A példa bemenetként contosoBooks.xsd
is szerepel.
<?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>
Módosítások érvényesítése
Miután módosította az XML-dokumentumot, az osztály metódusával ellenőrizheti a módosításokat az XML-dokumentum Validate sémája XmlDocument alapján.
Az alábbi példa ellenőrzi, hogy a contosoBooks.xml
fájl be van-e töltve az XmlDocument objektumba XmlDocument egy érvényesítő XmlReader objektum használatával. Az XML-dokumentum sikeresen érvényesítve van, mivel a rendszer sémaérvényesítési hibák vagy figyelmeztetések létrehozása nélkül tölti be. A példa ezután két módosítást végez az XML-dokumentumon, amelyek a séma szerint contosoBooks.xsd
érvénytelenek. Az első módosítás egy érvénytelen gyermekelemet szúr be, amely sémaérvényesítési hibát eredményez, a második módosítás pedig a beírt csomópont értékét a kivételt eredményező csomópont típusának megfelelően érvénytelen értékre állítja.
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;
}
}
}
A példa bemenetként használja a contosoBooks.xml
fájlt.
<?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>
A példa bemenetként contosoBooks.xsd
is szerepel.
<?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>
A fenti példában két módosítás történik az objektumban található XML-dokumentumon XmlDocument . Az XML-dokumentum betöltésekor az esetleges sémaérvényesítési hibákat az érvényesítési eseménykezelő metódus kezelte, és a konzolra írta.
Ebben a példában az érvényesítési hibák az XML-dokumentum betöltése után lettek bevezetve, és az Validate osztály metódusával találták meg őket XmlDocument .
Az osztály metódusával XPathNavigator végrehajtott SetTypedValue módosítások azt eredményeztékInvalidCastException, hogy az új érték érvénytelen volt a csomópont sématípusa szerint.
Az értékek metódussal SetTypedValue történő módosításáról további információt az XML-adatok módosítása XPathNavigator használatával című témakörben talál.
Írásvédett érvényesítés
Az XPathDocument osztály egy XML-dokumentum írásvédett, memórián belüli ábrázolása. Az XPathDocument osztály és az XmlDocument osztály is létrehoz XPathNavigator objektumokat az XML-dokumentumok navigálásához és szerkesztéséhez. Mivel az XPathDocument osztály írásvédett osztály, XPathNavigator az objektumokból XPathDocument visszaadott objektumok nem szerkeszthetik az XPathDocument objektumban található XML-dokumentumot.
Érvényesítés esetén ugyanúgy hozhat létre XPathDocument objektumot, mint egy XmlDocument objektumot a jelen témakör korábbi részében ismertetett érvényesítő XmlReader objektummal. Az XPathDocument objektum betöltve ellenőrzi az XML-dokumentumot, de mivel nem szerkesztheti az xml-adatokat az XPathDocument objektumban, nem tudja újraértékelni az XML-dokumentumot.
Az írásvédett XPathNavigator és szerkeszthető objektumokról további információt az XML-adatok XPathDocument és XmlDocument használatával című témakörében talál.
Lásd még
- XmlDocument
- XPathDocument
- XPathNavigator
- XML-adatok feldolgozása az XPath-adatmodell használatával
- XML-adatok olvasása az XPathDocument és az XmlDocument használatával
- XML-adatok kiválasztása, kiértékelése és egyeztetése az XPathNavigator használatával
- XML-adatok elérése az XPathNavigator használatával
- XML-adatok szerkesztése az XPathNavigator használatával
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: