Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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 XPathDocument osztály használatával elvégezheti az XML-tartalom csak olvasható ellenőrzését is.
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ő XmlDocument objektummal töltődik be egy XmlReader 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 érvényesítése betöltés közben
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 objektum paraméterként adódik át, amelynek a ValidationType tulajdonsága Schema értékre van beállítva, és az XML-dokumentum számára az objektumban lévő XML-séma hozzá lett adva a XmlDocument objektum Schemas tulajdonságához. Ezután a rendszer az érvényesítő XmlReader objektumot használja az XmlDocument objektum létrehozásához.
Az alábbi példa érvényesíti a contosoBooks.xml fájlt, amikor az betöltésre kerül az XmlDocument objektumba, azáltal, hogy létrehozza a XmlDocument objektumot egy érvényesítő XmlReader objektum segítségével. 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 a contosoBooks.xsd is bemenetként használja.
<?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 beállítanak egy ValidationEventHandler-t az érvényesítésre XmlReader, akkor a ValidationEventHandler meghívásra kerül, amikor érvénytelen típus fordul elő.
Amikor a XmlSchemaException egy TypedValue értékre beállított invalid attribútumot vagy elemet ér el, egy XPathNavigator kivétel keletkezik.
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
Megjegyzé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 XmlDocument tulajdonságában található sémával Schemas 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 a contosoBooks.xsd is bemenetként használja.
<?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 érvényesíti a contosoBooks.xml fájlt, amikor az betöltésre kerül az XmlDocument objektumba, azáltal, hogy létrehozza a XmlDocument objektumot egy érvényesítő XmlReader objektum segítségével. 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 a contosoBooks.xsd is bemenetként használja.
<?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ákat az XML-dokumentum betöltése után vezették be, és a Validate osztály XmlDocument metódusával találták meg őket.
Az osztály metódusával SetTypedValue végrehajtott XPathNavigator 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.
Read-Only é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 a(z) XPathDocument osztály írásvédett osztály, a XPathNavigator objektumokból visszaadott XPathDocument objektumok nem tudják szerkeszteni a 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 és szerkeszthető XPathNavigator objektumokról további információt az XML-adatok XPathDocument és XmlDocument használatával történő olvasásáról szóló témakörben 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