Cumartesi, Haziran 11, 2011

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...

Perşembe, Haziran 02, 2011

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...