Makale Özeti

Bu yazımıda C# tarafında XML sorgularken veya yaratırken kullanabileceğiniz ve özünde XML verileriniz üzerinden otomatik olarak Entity sınıfını üretebilecek WCF Rest Starter Kit içerisinde bir araçtan bahsediyoruz.

Makale

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 ;)