Validasi Skema menggunakan XPathNavigator
Dengan menggunakan kelas XmlDocument, Anda dapat memvalidasi konten XML yang terdapat dalam objek XmlDocument dengan dua cara. Cara pertama adalah memvalidasi konten XML menggunakan objek validasi XmlReader dan cara kedua adalah menggunakan metode Validate dari kelas XmlDocument. Anda juga dapat melakukan validasi baca-saja terhadap konten XML menggunakan kelas XPathDocument.
Memvalidasi Data XML
Kelas XmlDocument tidak memvalidasi dokumen XML menggunakan DTD atau validasi skema XML (XSD) secara default. Itu hanya memverifikasi bahwa dokumen XML terbentuk dengan baik.
Cara pertama untuk memvalidasi dokumen XML adalah dengan memvalidasi dokumen saat dimuat ke dalam objek XmlDocument menggunakan objek validasi XmlReader. Cara kedua adalah memvalidasi dokumen XML yang sebelumnya tidak diketik menggunakan metode Validate dari kelas XmlDocument. Dalam kedua kasus, perubahan pada dokumen XML yang divalidasi dapat divalidasi ulang menggunakan metode Validate kelas XmlDocument.
Memvalidasi Dokumen saat Dimuat
Objek validasi XmlReader dibuat dengan meneruskan objekXmlReaderSettings ke metodeCreate kelas XmlReader yang mengambil objek XmlReaderSettings sebagai parameter. Objek XmlReaderSettings yang diteruskan sebagai parameter memiliki properti ValidationType yang diatur ke Schema
dan Skema XML untuk dokumen XML yang terdapat dalam objek XmlDocument yang ditambahkan ke properti Schemas-nya. Objek validasi XmlReader kemudian digunakan untuk membuat objek XmlDocument.
Contoh berikut memvalidasi file contosoBooks.xml
saat dimuat ke dalam objek XmlDocument dengan membuat objek XmlDocument menggunakan objek validasi XmlReader. Karena dokumen XML valid menurut skemanya, tidak ada kesalahan atau peringatan validasi skema yang dihasilkan.
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;
}
}
}
Contoh mengambil file contosoBooks.xml
sebagai input.
<?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>
Contoh juga menggunakan contosoBooks.xsd
sebagai input.
<?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>
Dalam contoh di atas, XmlSchemaValidationException akan dimunculkan ketika Load dipanggil karena ada atribut atau jenis elemen yang tidak cocok dengan jenis yang sesuai yang ditentukan dalam skema validasi. Jika ValidationEventHandler diatur pada validasi XmlReader, ValidationEventHandler akan dipanggil setiap kali jenis yang tidak valid ditemui.
XmlSchemaException akan dimunculkan ketika atribut atau elemen TypedValue yang diatur ke invalid
diakses oleh XPathNavigator.
Properti Validity dapat digunakan untuk menentukan apakah atribut atau elemen individual valid atau tidak saat mengakses atribut atau elemen dengan XPathNavigator.
Catatan
Saat dokumen XML dimuat ke dalam objek XmlDocument dengan skema terkait yang menentukan nilai default, objek XmlDocument memperlakukan default ini seolah-olah muncul di dokumen XML. Ini berarti bahwa properti IsEmptyElement selalu mengembalikan false
untuk elemen yang default dari skema, bahkan jika dalam dokumen XML ditulis sebagai elemen kosong.
Memvalidasi Dokumen menggunakan Metode Validasi
Metode Validate dari kelas XmlDocument memvalidasi dokumen XML yang terdapat dalam objek XmlDocument terhadap skema yang ditentukan dalam properti Schemas objek XmlDocument dan melakukan augmentasi infoset. Hasilnya adalah dokumen XML yang sebelumnya tidak diketik di objek XmlDocument diganti dengan dokumen yang diketik.
Objek XmlDocument melaporkan kesalahan validasi skema dan peringatan menggunakan delegasi ValidationEventHandler yang diteruskan sebagai parameter ke metode Validate.
Contoh berikut memvalidasi file contosoBooks.xml
yang terdapat dalam objek XmlDocument terhadap skema contosoBooks.xsd
yang terdapat dalam properti Schemas objek XmlDocument.
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;
}
}
}
Contoh mengambil file contosoBooks.xml
sebagai input.
<?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>
Contoh juga menggunakan contosoBooks.xsd
sebagai input.
<?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>
Memvalidasi Modifikasi
Setelah modifikasi dibuat pada dokumen XML, Anda dapat memvalidasi modifikasi terhadap skema untuk dokumen XML menggunakan metode Validate dari kelas XmlDocument.
Contoh berikut memvalidasi file contosoBooks.xml
saat dimuat ke dalam objek XmlDocument dengan membuat objek XmlDocument menggunakan objek validasi XmlReader. Dokumen XML berhasil divalidasi saat dimuat tanpa menghasilkan kesalahan atau peringatan validasi skema. Contoh kemudian membuat dua modifikasi pada dokumen XML yang tidak valid menurut skema contosoBooks.xsd
. Modifikasi pertama menyisipkan elemen turunan yang tidak valid yang menghasilkan kesalahan validasi skema, dan modifikasi kedua menetapkan nilai node yang diketik ke nilai yang tidak valid sesuai dengan jenis node yang menghasilkan pengecualian.
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;
}
}
}
Contoh mengambil file contosoBooks.xml
sebagai input.
<?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>
Contoh juga menggunakan contosoBooks.xsd
sebagai input.
<?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>
Pada contoh di atas, dua modifikasi dibuat pada dokumen XML yang terdapat dalam objek XmlDocument. Saat dokumen XML dimuat, kesalahan validasi skema apa pun yang ditemui akan ditangani oleh metode penanganan aktivitas validasi dan ditulis ke konsol.
Dalam contoh ini, kesalahan validasi diperkenalkan setelah dokumen XML dimuat dan ditemukan menggunakan metode Validate kelas XmlDocument.
Modifikasi yang dilakukan dengan menggunakan metode SetTypedValue dari kelas XPathNavigator menghasilkan InvalidCastException karena nilai baru tidak valid sesuai dengan jenis skema node.
Untuk informasi selengkapnya tentang mengubah nilai menggunakan metode SetTypedValue, lihat topik Memodifikasi Data XML menggunakan XPathNavigator.
Validasi Baca-Saja
Kelas XPathDocument adalah representasi baca-saja dengan representasi dalam memori dari dokumen XML. Kelas XPathDocument dan kelas XmlDocument membuat objek XPathNavigator untuk menavigasi dan mengedit dokumen XML. Karena kelas XPathDocument adalah kelas baca-saja, objek XPathNavigator yang dikembalikan dari objek XPathDocument tidak dapat mengedit dokumen XML yang terdapat dalam objek XPathDocument.
Dalam hal validasi, Anda dapat membuat objek XPathDocument sama seperti Anda membuat objek XmlDocument menggunakan objek validasi XmlReader seperti yang dijelaskan sebelumnya dalam topik ini. Objek XPathDocument memvalidasi dokumen XML saat dimuat, tetapi karena Anda tidak dapat mengedit data XML di objek XPathDocument, Anda tidak dapat memvalidasi ulang dokumen XML.
Untuk informasi lebih lanjut tentang objek XPathNavigator hanya-baca dan dapat diedit, lihat topik Membaca Data XML menggunakan XPathDocument dan XmlDocument.
Lihat juga
- XmlDocument
- XPathDocument
- XPathNavigator
- Memproses Data XML Menggunakan Model Data JalurX
- Membaca Data XML menggunakan XPathDocument dan XmlDocument
- Memilih, Mengevaluasi, dan Mencocokkan Data XML menggunakan XPathNavigator
- Mengakses Data XML menggunakan XPathNavigator
- Mengedit Data XML menggunakan XPathNavigator