ASP.NET de XML Belgerinin Geçerliliğini Denetlemek - I
XML belgelerinin onaylanması demek geçerli olup olmadığının denetlenmesi demektir. Peki bir XML belgesinin geçerli olması ne demektir?
Sizin adınıza doğru soruyu sorduğumu düşünüyorum.
Bu yazımızda işte bunları inceliyeceğiz. İlk bölümde bazı kavramlarla tanışacağız ikinci bölümde ise denetimi gerçekleştireceğiz.
Ama ne yazıkki XML, schema, DTD kavramlarını ilk defa bu yazıda görecekler için bir miktar ileri bir konu.
Ama onlar için bile mümkün olduğunca açıklayıcı olacağım.
Evet sorumuz “XML belgesinin geçerli olması ne demektir?” idi.
Çok basit anlamıyla bir XML belgesinin içeriğinin belirli kurallara göre oluşturulmasıdır.
Burada “geçerli” belge ile “iyi biçimli” (well formated) belge kavramlarını karıştımamak lazım.
İyi biçimli belge XML yazım kurallarına uygun oluşturulmuş belgedir. Geçerli belge ise ayrıca tanımladığımız kurallara uygun XML belgesidir. Bu kurallar XML belgesinin içeriği ile ilgilidir.
Örneğin bir şirket sahibi (veya yöneticisi) olduğunuzu düşünün ve satış departmanındaki bütün satıcıların raporlarını aynı formattaki bir XML belgesi olarak hazırlamasını istediğinizi varsayın. Bunun için oturup XML belgesinini içeriğini belirleyen kuralları oluşturmalısınız.
Mesela mutlaka tarih bulunmalıdır ve tarihte şu şu formatta olmalıdır gibi. Böylece karşınıza tarihsiz veya enterasan formatlarda tarihli XML belgeleri gelmez. Bu kurala uyarak rapor hazırlayan satıcıların raporları geçerli diğerlerininki ise geçersiz olacaktır.
Eğer bu kuralları belirlemezseniz karşınıza gelecek raporların Salı Pazar ından daha karmaşık olacağından emin olabilirsiniz.(Bu yaşanmış bir hikayedir)
Şimdi sizin adınıza diğer güzel bir soru ; Bu kuralları nasıl belirleyeceğiz?
Bunun birkaç yöntemi vardır. Bunlardan bir tanesi DTD (Document Type Definition), diğeri Schema (şemalardır). Birincisi ilk model ikincisi daha yeni, yani son model. Bu belgelerde tanımladığımız kurallar çerçevesinde oluşturduğumuz XML dokumanları geçerli olur. Tersinde ise dökümanımız geçersizdir. DTD ve Schema nın detaylarına girmeyeceğim. (Detaylar için kitabıma bakabilirsiniz / XML - zafer demirkol/pusula )
XML belgelerimizin geçerli olup olmadığını anlamak o kadar kolay değil. Çünkü eğer özel bir program kullanmıyorsanız bunu size kimse söylemez. Mesela iyi biçimli belge denetiminin aksine internet explorer da geçerli belge denetimi yoktur. Ancak XML belgemizle çalışan ve bir schema kullanan uygulama programında (eger kurallara uygun oluşturulmamışsa) belgemiz kabul görmeyecektir. Ancak nerede hata yaptığımızı kestirmek kolay değildir.ASP.NET de XML belgelerimizin geçerliliğini denetleyen yordamlar oluştumak mümkün.
Bunun için .NET de özel class lar tanımlanmıştır.
Artık biraz uygulamalara geçelim. Öncelikle xml belgemizin kurallarını belirleyen aşağıdaki şemayı oluşturalım:
sema.xsd
1. <?xml version="1.0" encoding="iso-8859-9" ?>
2. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
3. <xs:element name="turlar-rehberi">
4. <xs:complexType>
5. <xs:sequence>
6. <xs:element ref="tur" />
7. </xs:sequence>
8. </xs:complexType>
9. </xs:element>
10. <xs:element name="tur">
11. <xs:complexType>
12. <xs:sequence>
13. <xs:element name="tur-adı" type="xs:string" />
14. <xs:element name="güzergah" type="xs:string" />
15. <xs:element name="başlangıç-tarihi" type="xs:string" />
16. <xs:element name="bitiş-tarihi" type="xs:string" />
17. <xs:element name="ulaşım" type="xs:string" maxOccurs="2" />
18. <xs:element name="konaklama" type="xs:string" />
19. </xs:sequence>
20. </xs:complexType>
21. </xs:element>
22. </xs:schema>
Öncelikle dosya isminin uzantısının xsd olduğuna dikkatinizi çekmek istiyorum. Bu uzantı bir şema (schema) dosyasını tanımlar. Bu dosyamızda XML belgemizin içeriğinin nelerden ve nasıl oluşacağı tanımlanmaktadır.
Buna göre şemamız şunları söyler;
Bu şemanın bağlanacağı XML belgesinin kök elementi “turlar-rehberi” olmalıdır ve bu kök elment içinde, “tur” elementi mutlaka bulunmalıdır. Ancak “tur” elementi kompleks yapıdadır, yani içinde başka element (veya nitelikleri) barındırmaktadır.(4-8. satır)
“tur” elementi sırası ile şu elementleride barındırmalıdır:
tur-adı
güzergah
başlangıç-tarihi
bitiş-tarihi
ulaşım
konaklama
(10-21. satırlar)
Dikkatinizi çekmek istiyorum yuvalanmış elementler şemada tanımlanmış sırada olmalı.
Evet böylece şemamızı oluşturduk, artık bu şemayı bağladığımız XML belgeleri bu kurallara uymalıdır.
İşte bu kurallara uyan bir belge:
turlar_2.xml
<?xml version="1.0" encoding="iso-8859-9" ?>
<turlar-rehberi xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="sema.xsd">
<tur>
<tur-adı>Güneydoğu</tur-adı>
<güzergah>Ayvalık, İzmir, Çeşme, Kuşadası, Aydın</güzergah>
<başlangıç-tarihi>09-10-2001</başlangıç-tarihi>
<bitiş-tarihi>19-10-2001</bitiş-tarihi>
<ulaşım>Otobüs</ulaşım>
<ulaşım>Uçak</ulaşım>
<konaklama>3,4 yıldızlı oteller</konaklama>
</tur>
</turlar-rehberi>
2. satırda şemanın XML belgesine nasıl bağlandığını görüyoruz. Burada yol (path)tanımını doğru yapmak önemlidir.
Belgemizi incelersek, “tur” elementi mevcut. Bu elementin altında (yuvalanmış elementler) şemada belirttiğimiz gibi, sırası ile, diğer element tanımlarıda oluşturulmuş. Yani belgemiz şemada söylenenlere uygun olarak oluşturulmuş, geçerli bir belgedir.
Örneğin aşağıdakiler geçersiz belgelerdir;
<?xml version="1.0" encoding="iso-8859-9" ?>
<turlar-rehberi xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="sema.xsd">
<tur>
<tur-adı>Güneydoğu</tur-adı>
<başlangıç-tarihi>09-10-2001</başlangıç-tarihi>
<bitiş-tarihi>19-10-2001</bitiş-tarihi>
<ulaşım>Otobüs</ulaşım>
<ulaşım>Uçak</ulaşım>
<konaklama>3,4 yıldızlı oteller</konaklama>
</tur>
</turlar-rehberi>
(güzergah elementi tanımlanmamış)
<?xml version="1.0" encoding="iso-8859-9" ?>
<turlar-rehberi xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="sema.xsd">
<tur>
<tur-adı>Güneydoğu</tur-adı>
<güzergah>Ayvalık, İzmir, Çeşme, Kuşadası, Aydın</güzergah>
<başlangıç-tarihi>09-10-2001</başlangıç-tarihi>
<bitiş-tarihi>19-10-2001</bitiş-tarihi>
<konaklama>3,4 yıldızlı oteller</konaklama>
<ulaşım>Otobüs</ulaşım>
<ulaşım>Uçak</ulaşım>
</tur>
</turlar-rehberi>
(konaklama elementinin sırası yanlış)
Bu geçerliliği gözle denetlemek yukarıdada gördüğünüz gibi oldukça zordur. (Bir XML belgesi internet explorer’da geçersiz olsa bile hata vermeden açılır.)
İşte yazı dizimizin amacıda bu ASP.NET de bunları denetlemek. Bunun detaylarıda ikinci kısımda.