ASP .Net Linq ile XML kullanımı (Linq to XML)

.Net kullanmaya başladığımdan beri en çok beğendiğim özelliklerden biri hiç kuşkusuz Linq. Gerçekten bir çok konuda işleri bir hayli kolaylaştırmakta. Linq sayesinde diziler,sql, yazının konusu olan XML ve hatta google üzerinde bile işlem yapabiliyoruz. Daha önce linq ile nasıl sql işlemleri(sorguları) yapıldığından bahsetmiştim. Bu sefer de XML ile ilgili işlemlerin nasıl yapıldığından bahsedeceğim.

Aslından Linq kullanmadan da .Net'te XML işlemleri yapmak gayet kolay. Bir çok hazır sınıfın yanında XML şeması oluşturup daha sonra bunu sınıf yapısına çevirerek nesne olarak da işlem yapmak mümkün.

XML dosyamızın yapısı aşağıdaki şekilde
<?xml version="1.0" encoding="utf-8"?>
<kullanicilar>
      <kullanici id="1">
        <ad>A</ad>
        <soyad>B</soyad>
      </kullanici>
      <kullanici id="2">
        <ad>C</ad>
        <soyad>D</soyad>
      </kullanici>
      <kullanici id="5">
        <ad>E</ad>
        <soyad>F</soyad>
      </kullanici>
      <kullanici id="8">
        <ad>G</ad>
        <soyad>H</soyad>
      </kullanici>
    </kullanicilar>

Veri Okuma
Veri okumak için XDocument sınıfından yararlanıyoruz. Bu sınıftan bir nesne türetip yine aynı sınıfın static "Load()" metodu yardımıyla dosyamızı açıyoruz ve üzerinde Linq ile işlem yapılabilir hale getiriyoruz.
protected void Page_Load(object sender, EventArgs e)
{
    XDocument doc = XDocument.Load(Server.MapPath("~/XMLFile.xml"));
    if (doc != null)
    {
        IEnumerable<XElement> myUsers = from t0 in doc.Element("kullanicilar").Elements("kullanici")
                                        select t0;

        foreach (XElement user in myUsers)
        {
            Response.Write(user.Element("ad").Value + " " + user.Element("soyad").Value + "<br />");
        }
    }
}

Dikkat çekmek istediğim diğer metodlar "Element()" ve "Elements()". İlki tek bir "XElement" nesnesi döndürürken ikincisi "IENumrable" döndürür. Bundan dolayıda myUser değişkeni "IENumrable" tipinde bir değişken olur. İşin güzel tarafı Anonymous Type şeklinde veriler oluşturmakta mümkün. Bu sayede XML dosyasından çektiğimiz verileri direk olarak GridView,Dataview yada Repeater'a DatatSource olarak aktarmak mümkün



protected void Page_Load(object sender, EventArgs e)
{
    XDocument doc = XDocument.Load(Server.MapPath("~/XMLFile.xml"));
    if (doc != null)
    {
        var myUsers = from t0 in doc.Element("kullanicilar").Elements("kullanici")
                      where t0.Element("ad").Value == "A" || t0.Element("ad").Value == "C"
                      select new 
                      { 
                        Ad = t0.Element("ad").Value,
                        Soyad = t0.Element("soyad").Value,
                      };

        grdUserList.DataSource = myUsers;
        grdUserList.DataBind();
    }
}

Veri Ekleme

protected void Page_Load(object sender, EventArgs e)
{
    XDocument doc = XDocument.Load(Server.MapPath("~/XMLFile.xml"));
    if (doc != null)
    {
        XElement myElement = doc.Element("kullanicilar");
        XElement addedElement = new XElement(new XElement("kullanici", new XElement("ad", "Esat"), new XElement("soyad", "Arslan")));
        addedElement.SetAttributeValue("id", "5");
        myElement.Add(addedElement);
        doc.Save(Server.MapPath("~/XMLFile.xml"));
        
        var myUsers = from t0 in doc.Element("kullanicilar").Elements("kullanici")
                      select new
                      {
                          Ad = t0.Element("ad").Value,
                          Soyad = t0.Element("soyad").Value,
                      };
        grdUserList.DataSource = myUsers;
        grdUserList.DataBind();
    }
}

Veri ekleme için ilk önce parent node'u seçtik. Daha sonra XElement sınıfından oluşturduğumuz nesneyi "Add()" metodunu kullanarak dosyaya ekledik ve kaydettik.

Veri Güncelleme

protected void Page_Load(object sender, EventArgs e)
{
    XDocument doc = XDocument.Load(Server.MapPath("~/XMLFile.xml"));
    if (doc != null)
    {
        XElement myElement = (from t0 in doc.Element("kullanicilar").Elements("kullanici")
                             where t0.Attribute("id").Value == "5"
                             select t0).SingleOrDefault();

        if (myElement != null)
        {
            myElement.SetAttributeValue("id", "100");
            doc.Save(Server.MapPath("~/XMLFile.xml"));
        }

        var myUsers = from t0 in doc.Element("kullanicilar").Elements("kullanici")
                      select new
                      {
                          ID = t0.Attribute("id").Value,
                          Ad = t0.Element("ad").Value,
                          Soyad = t0.Element("soyad").Value,
                      };
        grdUserList.DataSource = myUsers;
        grdUserList.DataBind();
    }
}

Linq cümlesi kullanarak "id" değeri "5" olan kaydı çektik, xml yapısında ID değerleri nitelik(attribute) olarak girildiği için "SetAttributeValue()" metodu ile değerini "100" olarak değiştirip dosyayı kaydettik.

Kolay gelsin...

Google +1 Butonu

Google yeniliklerine bir yenisini daha ekledi. Bir kaç hafta önce gmail için "Önemli posta" uygulamasını uygulamaya koymuştu. Şimdide arama motoru için "Google +1 Butonu" hizmetini kullanıma koydu. Anlaşılan google daki amcalar boş durmuyorlar.

Google +1 Butonu Nedir?
Peki nedir bu hizmet derseniz bana ilk anımsattığı şey facebook daki "Beğen" uygulması oldu. Burdaki mantığı arama sonuçlarına yansıtarak daha kaliteli bir arama sonucu hizmeti vermeyi planlamışlar. Bence gayet de iyi olmuş. Bu sayede internet ortamındaki bilgi kirliliğinin bir nebze de olsa önüne geçilmiş olacak. Daha detaylı bilgi için burdan yararlanabilirsiniz.


Google +1 Butonunu Siteme Nasıl Yerleştirebilirim?
Uygulamayı siteye koymaksa gayet kolay. 2 adımda bunu yapabilirsiniz.

1-Aşağıdaki kodu sitenizin "<head></head>" tagları arasına yapıştırın.
<script type="text/javascript" src="http://apis.google.com/js/plusone.js">
  {lang: 'tr'}
</script>

2-Bu kodu "Google +1 Butonu'nun" gözükmesini istediğiniz yere yapıştırın.

<g:plusone></g:plusone>

Kolay gelsin...

Ubuntu 11.04 Natty Narwhaldan İzlenimler

En son ubuntu 10.04 sürümünü bilgisayara kurmuştum. Ubuntu 10.10 Maverick Meerkat versiyonunu kurup deneme fırsatım olmadı. Yaklaşık olarak 1 yıl aradan sonra yeni bir ubuntu sürümünü kurabildim.

Arada bir sürüm atlamama rağmen Ubuntu 11.04 Natty Narwhal beni köklü bir değişikliğin beklediğinin farkındaydım. Ve birazda heyecanlıydım. Çünkü Canonical'ın gnome masaüstü uçurup yerine kendi geliştirdiği unity masaüstü getireceğini biliyordum.

Kurulumda yapısal değişikliğe gitmişler. Bölge ve dil ayarlarını yaparken de kopyalama işlemine devam etmesi veya güncellemelerin kurulumla beraber yüklenmesi gibi. Gerçi bunlar 10.10 ile gelen özellikler ama benim ilk kez bunu deneme fırsatım oldu.

Lakin kurulum bitirip kullanmaya başlayınca unity beni şaşırtmaya başladı. Şaşırmama sebep olan şey(ler) ise kurar kurmaz karşılaştığım hatalar. Ubuntu gibi geniş bir kitleye sahip(Linux dağıtımı olarak) bir işletim sisteminin sorunlu bir masaüstü ile nasıl yayınlanabildiği. İlk bir iki hatanın ekran görüntüsünü alıp paylaşmayı planladım ama hataların arkası gelmeye devam edince vazgeçtim.

KDE masaüstülü Kubuntu değilde Gnome masaüstülü Ubuntuyu tercih etmemdeki en önemli etken sadeliği ve kullanışlı olmasıydı. İstediğime hemen ulaşa biliyordum. Ve windowsdan daha farklı bir masaüstü yaklaşımı vardı. Ama unity de durum böyle değil. Windows 7 ye benzer bir görev çubuğu var. Yeni bir uygulama açtığımda farklı bir sekme açmak yerine direk programın kısayolunun olduğu yere gurupluyor. Programın kısayolunun üzerine geldiğimde diğer pencerelere ulaşabiliyorum. Direk kurulu olarak gelen firefox da bu sistem sorun çıkartmıyor ama chrome'u gurup farklı 2 pencere açtığımda bir türlü ikinci pencereye sorunsuz ulaşamadım. Win 7 nin bu özelliğinden, doğru bir şekilde çalışmasına rağmen hiç hoşnut değildim, unity de de aynı sistemi daha BECERİKSİZ haliyle yapmışlar. Kullanmaya başlayalı 1-2 saat olmasına rağmen beni deli etmeyi başardı.

Beklentiler istenildiği gibi çıkmayınca böyle bir yazıda kaçınılmaz oldu tabi.Bu zamana kadar Ubuntu ile ilgili hep güzel şeyler yazdım, bu yazı ise alışılmışın dışında oldu. Lakin alışabilirim umudu ile Unity şu an için kaldırmayı düşünmüyorum. Biraz daha şansı hakediyor. Alışamazsamda hiç acımam Gnome kurar işime bakarım. Linux kullanmanın güzel yanı da bu aslında bir uygulamayı beğenmediysen alternatif çok.

Kolay gelsin...

ASP .Net RegisterStartupScript() ve RegisterClientScriptBlock() arasındaki fark

ASP .net ile javascript fonksiyonlarını tetikleyebileceğimiz metodlardan ikisi RegisterStartupScript() ve RegisterClientScriptBlock(). Bu yazıda bunların nasıl kullanıldığından ziyade aralarındaki farktan bahsedeceğim.

Ben server tarafında gerçekleşen bir olaydan sonra uyarı verdirmek için RegisterClientScriptBlock() kullanırdım. Lakin bir gün uyarı verdirmekten daha fazlasına ihtiyaç duydum. Mesela jQuery kullanarak sayfa içindeki bir elementin içeriğini değiştirmek gibi.

RegisterClientScriptBlock() kullanarak sayfadaki html elementlere erişmeyi başaramadım. Çünkü bu metod sayfadaki html elementleri render edilmeden çalışıyormuş.

Google da kısa bir aramadan sonra istediğimi yapmak için kullanmam gereken RegisterStartupScript() metodunu keşfettim.

Sayfanın Page_Load olayına aşağıdaki kodları eklediğimizde önce "Register Client Script Block" daha sonra "Register Startup Script" mesajlarını alırız.

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ClientScript.RegisterStartupScript(this.GetType(), "Mesaj1", "<script type='text/javascript'>alert('Register Startup Script')</script>");
ClientScript.RegisterClientScriptBlock(this.GetType(), "Mesaj2", "<script type='text/javascript'>alert('Register Client Script Block')</script>");
}
}


Şimdi de her iki metodu kullanarak sayfa içindeki html elementine erişip içeriğini değiştirmeyi deniyelim. Kodlar aşağıdaki şekilde.

Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript">
function icerikDegistir(icerik) {
var myDiv = document.getElementById("mesaj");
if (myDiv != null) {
myDiv.innerHTML = icerik;
}
else {
alert("Element bulunamadı");
}
}
</script>
</head>
<body>

<form id="form1" runat="server">
<div>
<asp:Button ID="btnScriptBlock" runat="server" Text="Script Block"
onclick="btnScriptBlock_Click" />
<asp:Button ID="btnStartupScript" runat="server" Text="Startup Script"
onclick="btnStartupScript_Click" />
<div id="mesaj"></div>
</div>
</form>
</body>
</html>


Default.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

}
protected void btnScriptBlock_Click(object sender, EventArgs e)
{
ClientScript.RegisterClientScriptBlock(this.GetType(), "ScriptBlock", "<script type='text/javascript'>icerikDegistir('Register Client Script Block')</script>");
}
protected void btnStartupScript_Click(object sender, EventArgs e)
{
ClientScript.RegisterStartupScript(this.GetType(), "StartupScript", "<script type='text/javascript'>icerikDegistir('Register Startup Script')</script>");
}
}










İlk resimde Script Block butonuna tıkladım ve "Element bulunamadı" şeklinde uyarı aldım. Ve resimde farkettiyseniz henüz butonlar görünmüyor. İkinci resimde ise Startup Script butonuna tıkladıktan sonra divin içeriğinin istediğim şekilde değiştiğini görüyoruz.

Bu yazınında sonuna geldik. Faydalı olması dileği ile kolay gelsin...

Linq ile Row_Number() Kullanımı

Bazen veri tabanından verileri sıralı olarak satır numaralarına göre çekmek isteyebiliriz. Örneğin NorthWind veri tabanını kullanarak Products tablosundan ProductName,UnitPrice ve QuantityPerUnit alanlarını satır numarası ile birlikte çekelim. Mssql'de böyle bir iş için aşağıdakine benzer bir sql cümlesi yazarak işimizi halledebiliriz.


select row_number() over (order by ProductID) as 'Satır No', ProductName, UnitPrice, QuantityPerUnit from Products


Şimdide böyle bir işlemin linq ile nasıl yazıldığına bakalım.


var productInfo = db.Products.Select(s => new { s.ProductName,s.UnitPrice,s.QuantityPerUnit})
.AsEnumerable()
.Select((s, sayac) => new
{
s.ProductName,
s.UnitPrice,
s.QuantityPerUnit,
satir_no= sayac + 1
});



Ne yaptığımıza bakacak olursak. İlk select işleminde ilgili alanları veri tabanında çektik. AsEnumarable() ile normalde IQueryable olan dönüş değerini IEnumerable'a çevirdik.

Dikkat etmemiz gereken yer ikinci select işlemi. Burada parantez içinde s ve sayac adında iki tane parametre tanımladık. s tablonun kendisine referans eder. sayac ise sıfırda başlayarak her kayıt için bir artan değişken görevini görür.

Linq ile Row_Number() kullanımı bu kadar.

Kolay gelsin...

Hastir öyle mi? (Yılmaz ÖZDİL)

Noel arifesi...

Lefkoşa.


Kumsal Mahallesi.
Numara 2.
Tek katlı, bahçeli ev.
Saat 22 suları.
Hava ayaz.
Boğuk, tok vuruşlar yırtıyor geceyi aniden, trok trok trok...
Kalleş, basıyor.
*
Mürüvvet Hanım, lambaları söndürüyor telaşla... Hakan kucağında. Uyuyor. Bebe. 10aylık... Dalıyor çocukların odasına, öbür koluna Kutsi’yi alıyor, 4 yaşında... “Kalk Murat”diyor bi yandan... Gözlerini ovuştura ovuştura kalkıyor Murat, henüz 6 yaşında. Eteğinin ucundan tutuyor anasının geceliğini... Dışardan hüzün abajuru gibi sızan sokaklambasının cılız ışığında, hayalet misali, parmaklarının ucuna basa basa banyoya süzülüp,dördü birden “küvet”e giriyor ve koyun koyuna sarılıyorlar, çıt çıkarmadan, duyulmasındiye nefes bile almadan.../_np/8932/12638932.jpg
*
Korkunç bekleyiş başlıyor.
*
Bir dakika.
İki dakika.
Üç dakika.
Saniyeler...
Asırlar gibi adeta.
Önce şangırtı duyuyorlar.
Pencere.
Kırılıyor.
Sonra, ayak sesleri...
Salondalar.
Vahşi haykırışları geliyor.
Ve, tekmeyle açılıyor banyonun kapısı...
Üç Rum.
Tarıyorlar.
33 el.
*
Evet, merhum gazeteci Sami Coşar tarafından çekilen ve hafızalarımıza mıh gibi çakılan “ofotoğraf”ın öyküsü bu...
Kanlı Noel.
*
Alnından vurmuşlardı Mürüvvet Hanım’ı, yedi yerinden daha...
Murat’tan üç kurşun çıktı.
Kutsi’den iki.
*
Evin direği, baba, tabip binbaşı, evde değildi o sırada... 103 Türk köyü basılmıştı son üçgünde, yaralılar vardı... Gönyeli’ye gitmişti. Göreve.
*
Bir babanın başına gelebilecek en büyük felaketi yaşayan bu tabip binbaşı, evlatlarınıncenazesini bizzat kendi elleriyle yıkadı... Minik bedenleri santim santim yokladı, Hakan’dakurşun izi bulamadı. 10 aylık bebecik... Vücudunu yavrularına siper etmeye çalışan anacığının altında kalmış, nefessizlikten boğularak can vermişti çünkü.
*
Sonra?
*
Rum taburu vardı oralarda...
Nizamiyesinde şu yazıyordu:
“Cesursan, gel al!”
*
Türk taburu kuruldu oraya...
Nizamiyesine şu yazıldı:
“Cesurum, geldim aldım!”
*
Bugün, oralarda, utanmadan, Türkiye defolsun gitsin diye “hastir” pankartı açan Rumdalkavuğu lavuk!
Yüreğin varsa...
Gel de al.

Ubuntu Flash Player Donma Sorunu

Ubuntuda ki tipik flash player sorunlarından biride tam ekran video izlerken donma olması. Ubuntu forumlarından okuduğum kadarıyla sorunun çözümü herkes için aynı olmaya biliyor.Ben bu sorundan aşağıdaki adımları uygulayarak kurtulabildim. Umarım işinize yarar...

1- /etc dizinine adobe adından bir dizin oluşturuyoruz.
sudo mkdir /etc/adobe

2- mms.cfg adından bir dosya oluşturup içine OverrideGPUValidation değerini true olarak ayarlayarak ekledik. Bu ayar sayesinde flash playerın her seferinde yaptığı GPU hızlandırma kontrolünü devre dışı bırakmış oluyoruz.

echo "OverrideGPUValidation=true" >~/mms.cfg

3- Son olarak mms.cfg dosyasını 1.adımda oluşturduğumuz /etc/adobe dizinine taşıyoruz.

sudo mv ~/mms.cfg /etc/adobe/


Daha az sorunlu flash player dileğiyle...
Kolay gelsin...