C# için XML sorgulama ve XML yaratmanın kısa yolu! XML'den Entityleri otomatik yaratın.

0 dakikada yazıldı

16054 defa okundu

Düzenle

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