Bir XLINQ hikayesi... 15 dakikalık projeden inciler.

0 dakikada yazıldı

8756 defa okundu

Düzenle

Dün verdiğim sözü tutmanın zamanı geldi. Sizlerle kodlarını paylaştığım
mini projenin içerisindeki önemli birkaç noktayı öne çekerek mini bir
XLINQ ve VB şovu yapmak istiyorum :) Üzgünüm C# cılar .Element veya
.Elements gibi metodlarla uğraşmak zorunda kalacaklar ve benim güzel
VB'mi bırakarak ek metotlar kullanmaya niyetim yok :) Ayrıca paylaştığım
proje de VB ile yazılmış durumda o nedenle bu yazı da full VB olacak.
(Sektörde benim kadar agresif C#'a
saldıran yok :) Allah sonumu hayır etsin:) Bu arada C#'ı severim yani
ama herkes yerinde sağ olsun ;))

Kodlara geçmeden önce gelin projenin kullandığı XML dosyalarının
yapısına bir göz atalım.

<?xml
version="1.0" encoding="utf-8"?>

<Olay>

  <Tag>223257</Tag>

  <Icerik>1112567</Icerik>

  <Katilimci>0</Katilimci>

  <Katilan
Adi="Ercan Altuğ
Yılmaz
" Mail="hebele@gubele.com" Tel="0900900900:)"
/>

  <Katilan
Adi="İbrahim
Demir
" Mail="hebele@gubele.com" Tel="0900900900"
/>

</Olay>

Projedeki her bir aktivite için aktivitenin TAG ozelliği ile aynı
isme sahip bir XML dosyası oluşturuluyor. Ayrıca TAG bilgisi neden
dosyanın içerisine de kaydetmişim bilmiyorum :) Şimdi kodumu okurken
saçma olduğunu gördüm. Neyse gece yarısı aceleyle herhangi bir planlama
olmadan kod yazılırsa böyle olur :) Yukarıdaki gibi yaratacağımız XML
dosyalarında Olay kök elementinin içerisinde Icerik kısmına söz
konusu aktivite ile ilgili açıklamaları içerecek olan HTML kodları
yerleştirilecek. Maksimum katılımcı sayısı Katilimci tagları arasına
yazılacak. Sonrasında aktiviteye kayıt olan herkesin bilgisi Katilan
taglarındaki gibi bu dosyaya eklenecek.

kayit.aspx

Bu dosyayı herhangi bir kaydı göstermek veya düzenlemek için
kullanacağız. Eğer bu dosyaya herhangi bir aktivitenin tag bilgisi adres
üzerinden ?tag=aktivite şeklinde aktarılmış ise söz konusu
aktivitenin bilgileri gelecek ve sonrasında değiştirilebilecek. Aksi
halde yeni bir aktivite yaratılacak. Önemli olan birinci nokta yeni bir
aktivite için yeni bir XML dosyası yaratarak içerisine gerekli bilgileri
ekleyebilmek.

Dim Belge As New
XDocument

Dim root As New
XElement("Olay")

root.Add(New XElement("Tag", TextBox2.Text))

root.Add(New XElement("Icerik", TextBox1.Text))

root.Add(New XElement("Katilimci", TextBox3.Text))

Belge.Add(root)

Belge.Save(Server.MapPath("App_Data") & "\" & TextBox2.Text & ".xml")

Yukarıdaki kodda bir XDocument yaratarak içerisine XElement'ler
ekliyoruz. Elementleri eklerken isterseniz değerlerini de ikinci
parametre olarak verebiliyorsunuz. Son olarak da XDocument'ın
Save metodu ile dosyayı kaydediyoruz. Olay aslında bu kadar basit.
Kullanıcının kutulara girdiği metinleri herhangi bir kontrolden
geçirmiyoruz, çünkü birincisi yönetim panelindeyiz. Yani güvenli bir
yerdeyiz, ikincisi bu projede buna zamanımız yok :D Ama aklınızda olsun
halka açık sitelerde böyle girişleri script injection için kontrol
etmek gerek.

Peki var olan bir dosyayı okuyup ekranda nasıl gösteririz?

Dim Belge =
XDocument.Load(Server.MapPath("App_Data") & "\" & Request.QueryString("tag") & ".xml")

TextBox2.Text = Belge.<Olay>.<Tag>.Value

TextBox3.Text = Belge.<Olay>.<Katilimci>.Value

TextBox1.Text = Belge.<Olay>.<Icerik>.Value

 

GridView1.DataSource = From Gelenler
In Belge.<Olay>.<Katilan> Select Gelenler.@Adi, Gelenler.@Mail, Gelenler.@Tel

GridView1.DataBind()

İlk satırda gördüğünüz üzere XDocument sınıfının Load metodu ile
dosyamızı okuyarak Belge değişkenine aktarıyoruz. Bu noktada
özellikle VB ile ilgili late-binding olayından bahsetmek istiyorum.
Dikkatinizi çektiyse Belge değişkenini tanımlarken herhangi bir
değişken tipi belirtmedim. Bu durum kod çalışırken run-time esnasında
değişkenin tipi belli olacak şeklinde çalışmıyor. Eğer böyle çalışsaydı
yıllar önceki VB'deki performans kaybını yaşamış olurduk. Tam tersine
biz bu kodumuzda Belge değişkeninin tipini belirtmesek de compiler
bunu algılayarak gerekli tanımlamaları yapacaktır. Zaten yukarıdaki
manzarada bile Visual Studio içerisinde Belge değişkeninin üzerine
fare ile geldiğimizde değişkenin tipinin algılandığını görebiliyoruz.
Buradan yola çıkıp "hiçbir değişkenin tipini tanımlamayın" diye bir
şey söylemiyorum, bu büyük bir hata olur fakat tipi belli bir şey için
de uğraşmaya gerek yok :) (VB'cilerdeki bu
tembellik nedir ya :D)

GridView ile ilgili kısma geçerken bu Grid'in ne işe yarayacağını
baştan söyliyeyim. Tüm kolonları otomatik yaratılmak üzere ayarlanmış
bir Grid olarak bu arkadaşımızın görevi aktiviteye kayıt olanların
bilgilerini göstermek. Bunun için doğrudan Belge değişkenimize bir LINQ
sorgusu göndererek istediğimiz bilgileri kolonlar şeklinde alıyoruz. Ne
kadar kolay değil mi?

default.aspx

Proje içerisinde değinmek istediğim bir diğer dosya da ana kayıt
sayfası. Bu sayfada ilk olarak söz konusu aktiviteye kayıt olan kişi
sayısını bularak maksimum sayının altında olup olmadığını kontrol
etmemiz gerekiyor. Yani XML dosyası içerisinde Katilan taglarını
saymamız gerek.

If Belge.<Olay>.<Katilimci>.Value <= Belge.<Olay>.<Katilan>.Count And Belge.<Olay>.<Katilimci>.Value <> 0 Then

Label1.Text = "Aktivite için maksimum
kayıt sayısına ulaşıldı. Üzgünüz, bir dahakine."

kayittablo.Visible = False

Else

Belge değişkenimize XML dosyasını yükledikten sonra doğrudan Olay'ın
Katilimci değerinden maksimum katılımcı sayısını alabiliyoruz. O ana
kadar toplam kaç kişinin kayıt olduğunu, yani Katilan taglarının
sayısını da doğrudan Count metodu ile alabiliyoruz. XLINQ cidden
süper bir şey, eskiden ömür tüketirdi bu işler.

Dim Belge =
XDocument.Load(Server.MapPath("App_Data") & "\" & Request.QueryString("event") & ".xml")

Belge.<Olay>.SingleOrDefault.Add(New XElement("Katilan",
New
XAttribute("Adi", TextBox1.Text), New XAttribute("Mail", TextBox2.Text), New XAttribute("Tel", TextBox3.Text)))

Belge.Save(Server.MapPath("App_Data") & "\" & Request.QueryString("event") & ".xml")

Son olarak gelelim kayıt olan ziyaretçinin bilgilerini XML dosyasına
eklemeye. XML dosyasını okuyarak içerisinde Olay kök elementini
buluyoruz. Normalde elementler liste olarak döndürüldüğü için bizim bu
listeyi tek bir elemente çevirmemiz lazım. Olay elementinin zaten
XML dosyasında bir adet olabileceğini biz biliyoruz, çünkü kök element.
O nedenle Olay'ı yakaladıktan sonra .SingleOrDefault diyerek
bunu tek bir element olarak alıyoruz ve içerisine Katilan elementi
ekliyoruz. Katilan elementini XElement olarak yaratırken birinci
parametrede elementin adını verdikten sonra istediğiniz kadar başka
XElement'ler veya XAttribute'ler ekleyebilirsiniz. Bizde
katılımcının adı, telefonu ve maili yeterli olacak. Son olarak dosyayı
diske kaydediyoruz.

XLINQ ile XML uygulamaları "bebelere balon" kıvamında!

Eski günlerde olsak yukarıdaki işlemleri yapabilmek için XSLT, XPATH
bilmenin yanı sıra bolca da XML okuma ve yazma için kod yazmanız
gerekirdi. Oysa bugün iş gerçekten çocuk oyuncağı da olmanın ötesinde
"bebelere balon" kıvamına gelmiş durumda. Umarım bu projeyi sizlerle
paylaşmam XLINQ'nun kullanımı ile ilgili ufak da olsa bir fikir verip bu
dünyaya giriş yapmanıza yardımcı olur.

Hepinize kolay gelsin.