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("1.0", "utf-8", "yes"), _
<catalog>
<%= From b In books Select _
<book id=<%= b.ID %>>
<author><%= b.Author %></author>
<title><%= b.Title %></title>
<genre><%= b.Genre %></genre>
<price><%= b.Price.ToString("0.00").Replace(",", ".") %></price>
<publish_date><%= b.PublishDate.ToString("yyyy-MM-dd") %></publish_date>
<description><%= b.Description %></description>
</book> %>
</catalog>)
xout.Save(Application.StartupPath & "\out.xml")
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