Veysel Uğur KIZMAZ

LINQ to XML Update

08.01.2012Okunma Sayısı: 7626Kategori: LINQ

 Bu makalemizde LINQ to XML ile XML’imize yeni node ekleme işlemini inceleyeceğiz.

 
Bu işlemi bir örnek uygulama ile inceleyelim. Öncelikle XML dosyamıza bir göz atalım.
 
UrunKategori.xml
<?xmlversion="1.0"encoding="utf-8"?>
<bakkal>
  <urunler>
    <urun>
      <id>1</id>
      <ad>Kola</ad>
      <kategoriid>1</kategoriid>
    </urun>
    <urun>
      <id>2</id>
      <ad>Meyve Suyu</ad>
      <kategoriid>1</kategoriid>
    </urun>
    <urun>
      <id>3</id>
      <ad>Peynir</ad>
      <kategoriid>2</kategoriid>
    </urun>
  </urunler>
  <kategoriler>
    <kategori>
      <id>1</id>
      <ad>Icecek</ad>
    </kategori>
    <kategori>
      <id>2</id>
      <ad>Yiyecek</ad>
    </kategori>
  </kategoriler>
</bakkal>
 
Bu örneğimizde öncelikle <urunler>’e bir <urun> ekleyelim. Bunun için bir class oluşturalım ve bu classı web projemizde çalıştıralım. Class’ımızda hem veritabanından <urunler>i çekme hem de yeni <urun> ekleme methodlarımız olsun.
 
Yeni bir ürün eklerken ürünün <id> bilgisini tespit etmek için basitçe, var olan ürünlerin <id>’sinin en büyük olanını alıp 1 artıralım.
 
Daha önceki LINQ to XML makalemizde select işlemini nasıl yapacağımızı incelemiştik. İsterseniz bu linkten tekrar göz atabilirsiniz.
 
public class XMLIslem
    {
        private string _xmlPath;
        public XMLIslem(string xmlPath)
        {
            _xmlPath = xmlPath;
        }
 
        public object Getir_Urunler()
        {
            XDocument xmlUrunler = XDocument.Load(_xmlPath);
            var urunler = (from urun in xmlUrunler.Element("bakkal").Element("urunler").Elements("urun")
                           select new Urun
                           {
                               Id = urun.Element("id").Value,
                               Ad = urun.Element("ad").Value,
                               Kategori = urun.Element("kategoriid").Value
                           }).ToList();
            return urunler;
        }
    }
 
Şimdi  “UrunKategori.xml”imize bir <urun> eklemenin LINQ to XML ile nasıl yapılacağını inceleyelim.
 
        public void Yeni_Urun(string urunAd, int kategoriId)
        {
            string urunId = ((List<Urun>)Getir_Urunler()).OrderByDescending(x => x.Id).FirstOrDefault().Id;
            urunId = (Convert.ToInt32(urunId) + 1).ToString();
 
            XElement bakkal = XElement.Load(_xmlPath);
            XElement urunler = bakkal.Element("urunler");
            XElement urun = new XElement("urun", new XElement("id", urunId), new XElement("ad", urunAd), new XElement("kategoriid", kategoriId));
            urunler.Add(urun);
            bakkal.Save(_xmlPath);
        }
 
Az önce de dediğimiz gibi, kayıt yapacağımız ürünün Id’sini en büyük Id’den bir büyüğü olacak şekilde almak istiyorduk. urunId değişkeninin atması bunun için yapılmaktadır. Getir_Urunler() ile tüm ürünler alınıp OrderByDescending ile Id’sine göre büyükten küçüğe sıralanıp FirstOrDefault() ile ilk (en büyük) kayıt alınıp bu kaydın Id özelliği alınıyor ve 1 artırılıyor. (Bu örnekte fazladan kod yazmamak için bu şekilde yapmayı istedim, farklı şekillerde de yapılabilir)
 
  • bakkal değişkenimize _xmlPath’teki (UrunKategori.xml) xml dosyamızı yüklüyoruz.
  • urunler değişkenimizde <urunler>’in altındaki elemanları alıyoruz.
  • urun değişkenimizde yeni ürün oluşturuyoruz. Oluştururken new XElement("urun", ile oluşturacağımız elemanın <urun> olduğunu belirtiyoruz. Parametre olarak  new XElement("id", urunId), new XElement("ad", urunAd), new XElement("kategoriid", kategoriId) değerlerini veriyoruz. Bunlar da <urun>’un altındaki <id>, <ad>, <kategorid> değerleridir.
  • urunler.Add(urun) ile <urunler>’in altına oluşturduğumuz <urun>’u ekliyoruz.
  • bakkal.Save(_xmlPath) ile xml dosyamızı tekrar kaydediyoruz.
 
Şimdi bu örneğimizi bir web uygulamasında inceleyelim.
 
Bir projemize bir web form ekleyelim. Formumuza bir gridview, 2 textbox 1 buton sürükleyip bırakalım.
 
 
Şimdi  “Ürün Kaydet” butonumuza 2 kere tıklayıp code behind tarafına geçelim ve Test1.aspx.cs’mizi şu şekilde düzenleyelim.
 
public partial class Test1 : System.Web.UI.Page
    {
        XMLIslem _islem;
 
        protected void Page_Load(object sender, EventArgs e)
        {
            _islem = new XMLIslem(Server.MapPath("XML/UrunKategori.xml"));
 
            GridView1.DataSource = _islem.Getir_Urunler();
            GridView1.DataBind();
        }
 
        protected void Button1_Click(object sender, EventArgs e)
        {
            _islem.Yeni_Urun(tbAd.Text, Convert.ToInt32(tbKategoriId.Text));
            Response.Redirect("Test1.aspx");
        }
    }
 
Page_Load’da UrunKategori.xml’deki verilerimizi alıp GridView1’de gösteriyoruz. Button1_Click’te ise yeni bir ürün ekliyoruz. Response.Redirect ile sayfayı yeniliyoruz. Bunun sebebi, gridimizin yeniden yüklenmesini sağlamak ve son yaptığımız ekleme işlemini de görebilmektir.
 
Şimdi projemizi çalıştırıp adım adım ilerleyelim.
 
İlk aldığımız ekran çıktısı aşağıdaki gibi olacaktır.
 
 
Textboxlara aşağıdaki değerleri girelim.
 
 
“Ürün Kaydet” butonuna basalım ve kayıt işlemini yapalım.
 
 
Kayıt işleminden sonra XML’imizin son hali aşağıdaki gibidir.
 
<?xmlversion="1.0"encoding="utf-8"?>
<bakkal>
  <urunler>
    <urun>
      <id>1</id>
      <ad>Kola</ad>
      <kategoriid>1</kategoriid>
    </urun>
    <urun>
      <id>2</id>
      <ad>Meyve Suyu</ad>
      <kategoriid>1</kategoriid>
    </urun>
    <urun>
      <id>3</id>
      <ad>Peynir</ad>
      <kategoriid>2</kategoriid>
    </urun>
    <urun>
      <id>4</id>
      <ad>Zeytin</ad>
      <kategoriid>2</kategoriid>
    </urun>
  </urunler>
  <kategoriler>
    <kategori>
      <id>1</id>
      <ad>Icecek</ad>
    </kategori>
    <kategori>
      <id>2</id>
      <ad>Yiyecek</ad>
    </kategori>
  </kategoriler>
</bakkal>
 
 
 
Veysel Uğur KIZMAZ
Bilgisayar Mühendisi
veysel@ugurkizmaz.com
www.ugurkizmaz.com