Ana Sayfa | English Blog | Seminer TV | Dil Cookie Sil  Blog'u Mail ile takip et!       
Daron Yöndem - May, 2009
bir yazılımcının tasarıları...
 Monday, May 11, 2009

Bugün Microsoft TechEd 2009 North America'nın ilk günündeydim. TechEd konferansı adından anlaşıldığı gibi Technology Education olarak geçiyor ve ağırlıklı olarak ITPro tarafına hitap edildiği gibi bir ön yargı olsa da benim ilk günden izlenimim biraz daha "ortaya karışık" havasını yansıttığı. İlk ayağı Kuzey Amerika'da yapıldıktan sonra farklı kıtalarda ayrı TechEd'ler düzenleniyor. Bu sene bize en yakın olan Kasım ayında Berlin'de olacak.

Microsoft TechEd 2009, Los Angeles
Microsoft TechEd 2009, Los Angeles

Cuma gününe kadar sürecek olan TechEd'in ilk günü benim için epey ilginç geçti. Keynote sonrasında görevli olduğum Regional Director Salonu'nda yerimi aldım. Özellikle Windows 7 konusunda heyecanın çok büyük olduğunu söyleyebilirim. Performans konusunun yanı sıra çok farklı işlevselliklerle beraber efsanevi bir işletim sistemi geliyor. Diğer yandan Server 2008 R2 yollarında ilerlerken Office 14 olarak geçen Office 2010 da Windows 7'nin gücünü de arkasına alarak karşımıza çıkacak, şimdilik Temmuz ayında Office 2010'un CTP'sini bekliyoruz. CTP için şansını denemek isteyenler buradan kayıt olabilirler.

İlginç gelişmeleri sizinle özellikle twitter üzerinden paylaşıyorum. Takip etmeyi unutmayın ;)

Not:Merak edenler olacaktır; maalesef MIX gibi TechEd'in videoları nette yayınlanmıyor :( O nedenle online takip etme şansınız yok. Yine de farklı bir içerikle olsa da TechEdOnline'ı deneyebilirsiniz.

Monday, May 11, 2009 6:16:24 AM (GTB Standard Time, UTC+02:00)  #    Comments [4]   Windows 7  | 
 Sunday, May 03, 2009

Bu hafta sonu epey yoğun bir tempo ile Ankara'da Bilkent Üniversitesi'ndeki iki etkinlik ve Çankaya Üniversitesi'ndeki bir etkinlik arasında gidip geldim :) Tüm bu tempo içerisinde XLINQ konusundan bahsettiğim her dakikada VB'nin Inline XML özelliğine hayran kalmayan kalmadı diyebilirim :) Ama gelin C#'cılar için de faydalı olabilecek bir ipucunu sizlerle paylaşiyim.

WCF Rest Starter Kit Preview 2

Aslında sizlere anlatacağım işlevsellik Rest based servislerin kullanımı için hazırlanmış. İsterseniz bu çerçevede aşağıdan download edebileceğiniz paketi bilgisayarınıa yükleyip diğer özellikleri de inceleyebilirsiniz. Fakat bizim bu yazımızda odaklanacağımız nokta C# ile XML sorgulama ve hızlıca XML yaratma konuları olacak.

http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24644

Özünde bugün rahatlıkla C# ile XML sorgulayabilir veya yaratabilirsiniz fakat elinizde hazır bir XML kodu olduğunu düşünürsek bu kodu yaratacak veya okuyacak C# kodunu yazarken sürekli hedef XML'in yapısını incelemek zorunda kalıyoruz. VB'de Inline XML bu sorunu tamamen çözse de C# içerisinde ancak WCF Rest Starter Kit ile beraber gelen araçları kullanarak işimizi kolaylaştırabiliriyoruz.

WCF Rest Starter Kit ile beraber "Past XML as Types"
WCF Rest Starter Kit ile beraber "Past XML as Types"

Elimizde gelen hazır bir formatta XML yaratalım!

Elimize aşağıdaki gibi hazır bir formatta XML geldiğini varsayalım. Bir şekilde bu XML ile aynı yapıda elimizde yer alan farklı bir veriden XML oluşturmak durumunda kalırsak tek tek her tagı yaratan XElement, XAttribute vs nesnelerini yaratmamız gerekecektir. Oysa eğer bilgisayarınızda WCF Rest Starter Kit yükledi iseniz işiniz daha kolay.

[XML]

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

<DenemeVeri>

  <Urunler>

    <Urun No="145">

      <Adi>Örnek Ürün</Adi>

      <Kodu>df234sd</Kodu>

    </Urun>

    <Urun No="146">

      <Adi>Örnek Ürün</Adi>

      <Kodu>df234sd</Kodu>

    </Urun>

  </Urunler>

</DenemeVeri>

WCF Rest Starter Kit kurulumunu tamamladıktan sonra doğrudan Visual Studio'nun Edit menüsüne giderseniz "Past XML as Types" diye bir seçenek göreceksiniz. Yukarıdaki örnek XML'i kopyaladıktan sonra Visual Studio içerisinde herhangi bir projeye yeni bir CS dosyası ekleyip içine kopyaladığımız XML'i "Past XML as Types" diyerek yapıştıralım.

[C#]

/// <remarks/>

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3521")]

[System.Diagnostics.DebuggerStepThroughAttribute()]

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]

[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]

public partial class DenemeVeri

{

 

    private DenemeVeriUrunler urunlerField;

 

    /// <remarks/>

    public DenemeVeriUrunler Urunler

    {

        get

        {

            return this.urunlerField;

        }

        set

        {

            this.urunlerField = value;

        }

    }

}

/// <remarks/>

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3521")]

[System.Diagnostics.DebuggerStepThroughAttribute()]

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]

public partial class DenemeVeriUrunler

{

 

    private DenemeVeriUrunlerUrun urunField;

 

    /// <remarks/>

    public DenemeVeriUrunlerUrun Urun

    {

        get

        {

            return this.urunField;

        }

        set

        {

            this.urunField = value;

        }

    }

}

/// <remarks/>

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3521")]

[System.Diagnostics.DebuggerStepThroughAttribute()]

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]

public partial class DenemeVeriUrunlerUrun

{

 

    private string adiField;

 

    private string koduField;

 

    private DenemeVeriUrunlerUrunFiyatlar fiyatlarField;

 

    private byte noField;

 

    /// <remarks/>

    public string Adi

    {

        get

        {

            return this.adiField;

        }

        set

        {

            this.adiField = value;

        }

    }

 

    /// <remarks/>

    public string Kodu

    {

        get

        {

            return this.koduField;

        }

        set

        {

            this.koduField = value;

        }

    }

 

    /// <remarks/>

    public DenemeVeriUrunlerUrunFiyatlar Fiyatlar

    {

        get

        {

            return this.fiyatlarField;

        }

        set

        {

            this.fiyatlarField = value;

        }

    }

 

    /// <remarks/>

    [System.Xml.Serialization.XmlAttributeAttribute()]

    public byte No

    {

        get

        {

            return this.noField;

        }

        set

        {

            this.noField = value;

        }

    }

}

/// <remarks/>

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3521")]

[System.Diagnostics.DebuggerStepThroughAttribute()]

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]

public partial class DenemeVeriUrunlerUrunFiyatlar

{

 

    private byte[] fiyatField;

 

    private byte seviyeField;

 

    /// <remarks/>

    [System.Xml.Serialization.XmlElementAttribute("Fiyat")]

    public byte[] Fiyat

    {

        get

        {

            return this.fiyatField;

        }

        set

        {

            this.fiyatField = value;

        }

    }

 

    /// <remarks/>

    [System.Xml.Serialization.XmlAttributeAttribute()]

    public byte Seviye

    {

        get

        {

            return this.seviyeField;

        }

        set

        {

            this.seviyeField = value;

        }

    }

}

Yukarıda da gördüğünüz üzere biraz önce yapıştırdığımız tüm XML kodu bir anda Entity'ler olarak karşımıza çıkıyor. Böylece artık bu Entity'leri kullanarak aynı formatta bir XML yaratabiliriz. Gelin bir deneyelim;

[C#]

        DenemeVeri Ornek = new DenemeVeri();

        DenemeVeriUrun[] Urunler = new DenemeVeriUrun[1];

        DenemeVeriUrun YeniUrun = new DenemeVeriUrun();

        YeniUrun.Adi = "Örnek Ürün";

        YeniUrun.Kodu = "123";

        YeniUrun.No = 123;

        Urunler[0] = YeniUrun;

        Ornek.Urunler = Urunler;

 

        XmlSerializer MySerializer = new XmlSerializer(typeof(DenemeVeri));

        TextWriter TW = new StringWriter();

        MySerializer.Serialize(TW, Ornek);

        Response.Write(TW.ToString());

Yukarıdaki kod içerisinde aslında XML taglarından türetmiş olduğumuz Entity'leri kullanarak yeni bir XML kaynağı yaratabiliyoruz. Tüm bunları yaparken nesneler tanımlı olduğu için hem nested itemların yapılarını kontrol etmemize gerek kalmıyor hem de Intellisens bize yardımcı oluyor :)

Peki ya XML sorgularken?

Elimizde tanımı hazır bir XML dosyasından Entity'leri yarattığımıza göre aslında yine bildiğimiz bir XML'i okuyarak bu Entity'lere de çevirebiliyor olmamız gerek. Böylece XML sorgularken karşılaştığımız ve karşımızdaki XML'in yabancı bir yapıya sahip olmasından yola çıkan zorluklardan yine kurtulabiliriz.

[C#]

        XDocument Dok = XDocument.Load(Server.MapPath("XMLFile.xml"));

        XmlSerializer MySerializer = new XmlSerializer(typeof(DenemeVeri));

        TextReader TW = new StringReader(Dok.ToString());

        DenemeVeri Denek = MySerializer.Deserialize(TW) as DenemeVeri ;

        Response.Write(Denek.Urunler.Count());

Yukarıda gördüğünüz kod içerisinde ilk olarak makalemizin başındaki XML'in kayıtlı olduğu bir XML dosyasını okutuyoruz. Söz konusu XML dosyasının içeriğinden yarattığımız Entity'ler projemizin içerisinde yine hazır bulunuyorlar. Bu noktadan sonra tek yapmamız gereken eldeki XML'i DeSerialize ederek yine elde tanımlı Entity'lere çevirmek. Çeviri işlemini de tamamladıktan sonra artık rahat rahat istediğimiz veriye Intellisense'in de yardımı ile ulaşabiliriz. Hedef XML'in yapısı hiç bilmesek de sorgulama yapmak Entity'ler sayesinde kolaylaşıyor.

[C#]

        Response.Write((from inc in Denek.Urunler where inc.No==145 select inc.Adi).Single());

Yukarıda gördüğünüz sorgu aslında biraz önce DeSerialize ettiğimiz XML'i sorguluyor. Yine Intellisense ve LINQ yardımı ile sorgunun kodunu yazmak da çok kolaylaşıyor.

Hepinize kolay gelsin ;) C#'cılar ;)

Sunday, May 03, 2009 3:13:34 PM (GTB Standard Time, UTC+02:00)  #    Comments [11]   LINQ | C#  | 
Copyright © 2010 Daron Yöndem. Tüm hakları saklıdır.