1. XML validasiyasına nə üçün ehtiyac var
XML çox çevik formatdır, bəzən həddindən artıq çevik. Sərt tipli məlumatlardan fərqli olaraq, XML səhvlərə "təhlükətsiz" yanaşa bilər; əgər siz teqi bağlamağı unutmusunuzsa, və ya kiminsə atributun adını səhv yazması kimi hallarda, proqram faylın parslanması zamanı səhv verə bilər… və ya ümumiyyətlə problemi hiss etməyə bilər ki, bu daha pisdir.
XSD (XML Schema Definition) üzrə validasiya — bu, XML faylınızın əvvəlcədən müəyyən edilmiş müqaviləyə tam uyğun olduğunu yoxlamaq üçün üsuldur: teqlərin adları necə olmalıdır, hansı ardıcıllıqla yerləşirlər, onların tipləri nədir, hər hansı teq məcburidir və ya neçə ədəd ola bilər. Bu, məlumatlarınız üçün pasport nəzarəti kimidir — sxema deyir: "Lazım olan sahə olmadan və ya sahə düzgün uzunluqda olmadıqda sizi buraxmayacağam!"
Validasiya korporativ sistemlərdə, müxtəlif sistemlər arasında məlumat mübadiləsində, API-lərdə vacibdir — yəni strukturunun qeyri-dəqiq qəbul olunması arzuolunmaz olduğu hər yerdə.
XSD (XML Schema Definition) — bu, digər XML-in strukturunu rəsmi surətdə təsvir edən ayrıca XML sənədidir. XSD-də siz yazırsınız: hansı teqlər icazəlidir, hansılar məcburidir, atributların və ya iç elementlərin tipləri nədir, sətir üçün nümunələr (pattern), ədədlər üçün məhdudiyyətlər, hətta mümkün dəyərlər (məhdudiyyət və enumeration vasitəsilə).
| XML | XSD (strukturun təsviri) |
|---|---|
|
|
|
|
XSD mənaca JSON dünyasında JSON Schema-ya oxşardır.
2. XSD və əlaqəli XML nümunəsi
XML nümunəsi
<person age="23">
<name>Ivan</name>
<email>ivan@example.com</email>
</person>
XSD nümunəsi
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="email" type="xs:string" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="age" type="xs:positiveInteger" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
Bu sxema nəyi təsvir edir:
- Root element — <person>.
- <person> daxilində <name> (zəruridir) və <email> (istəyə bağlı) elementləri olmalıdır.
- <person>-da mütləq age atributu olmalıdır və onun dəyəri müsbət tam ədəd olmalıdır.
3. .NET-də XSD ilə XML validasiyası
.NET-də klassik yanaşma — System.Xml və System.Xml.Schema namespace-lərindən istifadə etməkdir.
İş prinsipi:
- XML faylını yükləmək
- XSD-sxemini yükləmək
- Sxemanı validasiyaya "qoşmaq"
- Validasiya prosesini işə salmaq və mümkün səhvləri işləmək
Sadə nümunə belədir:
using System;
using System.IO;
using System.Xml;
using System.Xml.Schema;
// 1. Validasiya nəticələri üçün handler
void ValidationCallBack(object? sender, ValidationEventArgs e)
{
Console.WriteLine($"Validasiya xətası: {e.Message}");
}
string xmlPath = "person.xml";
string xsdPath = "person.xsd";
// 2. Sxeməni yükləyirik
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add("", xsdPath);
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas = schemas;
settings.ValidationType = ValidationType.Schema;
settings.ValidationEventHandler += ValidationCallBack;
// 3. XML-i bu ayarlarla açırıq
using XmlReader reader = XmlReader.Create(xmlPath, settings);
while (reader.Read())
{
// Sənəd boyunca oxumaq kifayətdir - validasiya "canlı" baş verir
}
Console.WriteLine("Validasiya başa çatdı!");
Şərhlər:
- Bütün validasiya xətaları ValidationCallBack callback-də tutulacaq.
- Əgər xəta yoxdursa — sənəd sxemə uyğundur (ValidationType.Schema).
- Əgər uyğunsuzluq varsa (məsələn, age yoxdursa, email düzgün deyil, əlavə lazımsız sahə varsa və s.) — onlar konsolda görünəcək.
Müxtəlif səhv növləri və geribildirim
XSD üzrə validasiya müxtəlif səbəblərdən "şikayətlənə" bilər. Ən çox yayılmış ssenarilər və nümunə səhvlər:
- Məcburi element yoxdur (defolt üzrə minOccurs="1").
- Sxemədə təsvir edilməmiş əlavə tag.
- Atribut səhv tipdədir (age="abc" kimi, sayımaq yerinə mətn).
- Sətirlər pattern-ə uyğun gəlmir (məsələn, <xs:pattern> vasitəsilə təsvir olunur).
Tipik xəta:
Validasiya xətası: Element 'age' mətn məzmunu 'abc' qeyri-qəbulolunandır. Gözlənilən tip 'xs:positiveInteger' idi.
4. Daha mürəkkəb XSD-sxemlər: tiplər, enumeration, pattern-lər
XSD demək olar ki, icazəli məlumatları təsvir etmək üçün öz dilidir. Bir neçə inkişaf etmiş nümunə:
İcazə verilən dəyərlərin siyahısı (enumeration)
<xs:element name="gender">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="male"/>
<xs:enumeration value="female"/>
<xs:enumeration value="diverse"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Sətir uzunluğunun məhdudlaşdırılması
<xs:element name="code">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Email üçün pattern (sadələşdirilmiş)
<xs:element name="email">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="\w+@\w+\.\w+"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Öz tiplərinizi yarada, onlardan irs ala və nested elementlərdən istifadə edə bilərsiniz — demək olar ki, OOP kimi!
5. Mürəkkəb sənədin validasiyası
Tutaq ki, tədris tətbiqimiz indi tələbə siyahısını XML-də ixrac edir. Bir az kod əlavə edək!
XML nümunəsi
<students>
<student id="1">
<name>Elena</name>
<grade>5</grade>
</student>
<student id="2">
<name>Alexey</name>
<grade>4</grade>
</student>
</students>
XSD-sxema
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="students">
<xs:complexType>
<xs:sequence>
<xs:element name="student" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="grade">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="1"/>
<xs:maxInclusive value="5"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="xs:integer" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Validasiya kodda (eyni yanaşma ilə):
// Fayl yolları
string xmlPath = "students.xml";
string xsdPath = "students.xsd";
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add("", xsdPath);
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas = schemas;
settings.ValidationType = ValidationType.Schema;
settings.ValidationEventHandler += ValidationCallBack;
using XmlReader reader = XmlReader.Create(xmlPath, settings);
while (reader.Read()) { /* əvvəlki kimi */ }
6. Faydalı nüanslar
Sxemanı birbaşa XML-də necə göstərmək (xsi:schemaLocation)
Praktikada çox vaxt root elementdə xsi:schemaLocation və ya xsi:noNamespaceSchemaLocation atributlarını görmək olar:
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="students.xsd">
...
</students>
Bu faylı "avtomatik" validasiya etmir, amma bəzi validatorlara və redaktorlara sxemanı tapmaqda kömək edir. .NET validasiyasında bu məcburi deyil, amma formal olaraq düzgündür.
"Canlı" validasiya və yaddaşda — XDocument ilə
Əgər siz LINQ to XML (XDocument) ilə işləyirsinizsə, XML sənədini fayllardan istifadə etmədən yaddaşda da validasiya etmək olar:
using System.Xml.Linq;
using System.Xml.Schema;
// Sxeməni yükləmə
XmlSchemaSet schema = new XmlSchemaSet();
schema.Add("", "students.xsd");
// XML-i yaddaşa yükləmə
XDocument doc = XDocument.Load("students.xml");
// Validasiya
doc.Validate(schema,
(o, e) => Console.WriteLine($"Xəta: {e.Message}"),
true // Warning-ləri də yoxlamaq (çox vaxt artıq olur)
);
Bu yanaşma proqramla XML yaradılanda və ya dəyişdiriləndə, və siz sxemə zidd yeni bir struktur yaratmadığınızdan əmin olmaq istədikdə əlverişlidir.
7. XSD ilə XML validasiyasında tipik səhvlər
Xəta №1: sxema qoşulmayıb və ya xsd üçün səhv yol göstərilib.
Nəticədə heç bir validasiya aparılmır və XML faylı "keçib gedir", hətta içində səhvlər olsa belə. Çox vaxt yol nisbidir və proqram faylı gözlənilməyən yerdə axtarır. Test üçün mütləq absolute path istifadə etmək və ya sxeməni executable ilə eyni qovluğa qoymaq yaxşı praktika olar.
Xəta №2: namespace-lər uyğun gəlmir.
Əgər sizin sxema namespace istifadə edirsə, XmlSchemaSet-inAdd metoduna sxemanın namespace-ini ikinci arqument kimi ötürməlisiniz. Əks halda, struktur doğru olsa belə validasiya uğursuz olacaq. Namespace yoxdursa — boş string verin.
Xəta №3: elementlərin sırası uyğun gəlmir.
Əgər sxemədə <xs:sequence> dəqiq göstərilibsə, elementlərin sırası vacibdir. Elementlər səhv sırada olduqda XML səhv sayılacaq.
Xəta №4: XML-də bir neçə namespace göstərilib.
Əgər sənəd birdən çox namespace istifadə edirsə, bu validasiyada gözlənilməz problemlərə gətirə bilər. Çoxnamespace dəstəyi xüsusi diqqət və sxema tənzimləməsi tələb edir.
Xəta №5: səhvləri yığmamaq və saxlamaq.
Xətaları birbaşa konsola yazmaq debug üçün uyğun olsa da, production tətbiq üçün ideal deyil. Daha yaxşısı xətaları siyahıda yığmaq və istifadəçiyə rahat formada göstərməkdir — xüsusən çoxlu faylların yoxlanması zamanı (məsələn, web-serverdə).
GO TO FULL VERSION