Skip to content

LinQtoXML for dummies

Geçen günlerin birinde Google Analytics üzerinde yaptığım bir incelemede gördüm ki, bu bloga arama motoruyla gelen milyonların (yersen) en çok kullandığı keywordlerden birisi linqtoxml. Bu etiketli tek bir yazım vardı oldukça geçmiş tarihli ve aslında çok bir amaca hizmet etmeyen basit bir yazımdı sadece. Ama google üzerinde bu keyword le bir arama yaptım ve gördüm ki, konu üzerine yapılan çalışmalar oldukça kısıtlı. Bu vesileyle biraz linqtoxml for dummies konulu kısa bir kod örneği ile linq ile xml kullanımını göstereyim istedim. Yoksa tüm bu yazının amacı google da bir kaç sıra daha yukarıya çıkmak kesinlikle değildir (yersen 2).

Şimdi efendim, xml nedir ile başlayacak kadar geçmişe gitmeyeceğim. Hatta “linq nedir” sorusunu da uzun uzadıya anlatmayacağım. Kısaca linq dediğimiz şey .net v3.5 ile hayatımıza kazandırılan syntax’a gömülü veri sorgulama dilidir. Eskiden bir xml den, bir veri tabanından … kısaca bir veri kaynağından bir sorgulama yapacağımızda o veri kaynağıyla ilgili sınıflar üzerinde işlem yaparken şimdi LinQ sayesinde tüm bu kaynaklar için ortak bir dil kullanarak sorgulama yapabilmekteyiz.

Örneğe geçelim, yine önceki örneklerde olduğu gibi örnek dosya olarak şu dosyayı kullanacağız. Önce bu dosyadaki öğeleri yükleyeceğimiz bir entity sınıfı yaratalım;

Public Class Book

    Private _id As String
    Public Property ID() As String
        Get
            Return _id
        End Get
        Set(ByVal value As String)
            _id = value
        End Set
    End Property

    Private _author As String
    Public Property Author() As String
        Get
            Return _author
        End Get
        Set(ByVal value As String)
            _author = value
        End Set
    End Property

    Private _title As String
    Public Property Title() As String
        Get
            Return _title
        End Get
        Set(ByVal value As String)
            _title = value
        End Set
    End Property

    Private _genre As String
    Public Property Genre() As String
        Get
            Return _genre
        End Get
        Set(ByVal value As String)
            _genre = value
        End Set
    End Property

    Private _price As Decimal
    Public Property Price() As Decimal
        Get
            Return _price
        End Get
        Set(ByVal value As Decimal)
            _price = value
        End Set
    End Property

    Private _publishDate As Date
    Public Property PublishDate() As Date
        Get
            Return _publishDate
        End Get
        Set(ByVal value As Date)
            _publishDate = value
        End Set
    End Property

    Private _decription As String
    Public Property Description() As String
        Get
            Return _decription
        End Get
        Set(ByVal value As String)
            _decription = value
        End Set
    End Property
End Class

Sonra bu sınıf temelli bir generic list yaratalım ve dosya içerisindeki verilerle bu listi dolduralım

Dim xinp As XDocument = XDocument.Load(Application.StartupPath & "\inp.xml")
        Dim books As List(Of Book) = (From xbook In xinp...<book> _
                                                     Select New Book With { _
                                                     .Author = xbook.<author>.Value, _
                                                     .Description = xbook.<description>.Value, _
                                                     .Genre = xbook.<genre>.Value, _
                                                     .ID = xbook.@id.ToString, _
                                                     .Price = xbook.<price>.Value.Replace(".", ","), _
                                                     .PublishDate = Date.Parse(xbook.<publish_date>.Value.ToString), _
                                                     .Title = xbook.<title>.Value _
                                                     }).ToList

Görülebileceğimiz üzere, evvel zaman içinde XMLDocument olarak kullandığımız sınıf linqtoxml içerisinde XDocument adında ve factory metodu olarak Load fonksiyonunu kullandık. Sonra bir generic list yarattık ve içerisini linqtoxml sorgusu ile doldurduk. Burada linq dil yapısına eklenti olarak gelen üç şey var, birincisi örnekteki xbook.<author> tanımı bu xbook dalı altındaki author dalını refere ediyor, bir diğeri xinp…<book> bu ise xinp dalı altındaki tüm book dallarını refere ediyor, sonuncu olarak ise xbook.@id bu ise xbook dalındaki id isimli attribute’e karşılık geliyor. Bu tanımlamalarla her bir alt dal için book sınıfı yaratılıyor, dolduruluyor ve listeye ekleniyor. Tüm işlem tek satırda bu şekilde tamamlanıyor.

Şimdi ise tersi işlemi yapalım ve doldurulmuş olan bu list den xml dosyasını oluşturalım;

Dim xout As New XDocument(New XDeclaration(&quot;1.0&quot;, &quot;utf-8&quot;, &quot;yes&quot;), _
                                  &lt;catalog&gt;
                                      &lt;%= From b In books Select _
                                          &lt;book id=&lt;%= b.ID %&gt;&gt;
                                              &lt;author&gt;&lt;%= b.Author %&gt;&lt;/author&gt;
                                              &lt;title&gt;&lt;%= b.Title %&gt;&lt;/title&gt;
                                              &lt;genre&gt;&lt;%= b.Genre %&gt;&lt;/genre&gt;
                                              &lt;price&gt;&lt;%= b.Price.ToString(&quot;0.00&quot;).Replace(&quot;,&quot;, &quot;.&quot;) %&gt;&lt;/price&gt;
                                              &lt;publish_date&gt;&lt;%= b.PublishDate.ToString(&quot;yyyy-MM-dd&quot;) %&gt;&lt;/publish_date&gt;
                                              &lt;description&gt;&lt;%= b.Description %&gt;&lt;/description&gt;
                                          &lt;/book&gt; %&gt;
                                  &lt;/catalog&gt;)
        xout.Save(Application.StartupPath &amp; &quot;\out.xml&quot;)

Burada ise yeni bir XDocument oluşturuyoruz ve içeriğini diziden for each döndürerek dolduruyoruz. Burada asp den hatırlayacağımız <% %> etiketi dikkatinizi çekmiştir. Linqtoxml in bir güzelliği olarak direkt xml etiketlerini dil içerisine yazıp xdocument yaratabilmekteyiz. Bu yazım esnasında kodlamaya ihtiyaç duyduğumuz bu gibi örneklerde tıpkı bir asp sayfası yazıyor gibi <% %> etiketi arasına kodlarımızı yazabiliyoruz. Yine asp de olduğu gibi response.write zamanlarından kalma bir biçimde <%= b.ID %> şeklinde xml içerisine sınıftan gelen verileri yerleştiriyoruz.

Post a Comment

Your email is never published nor shared. Required fields are marked *
*
*