StreamReader‘ı XmlReader‘a Dönüştürmek .Net 2.0/C#

.NET programlama dünyasında, XML dosyalarıyla çalışmak yaygın bir görevdir, özellikle veri setleri ile uğraşırken. Eğer bir StreamReader‘ı XmlReader‘a dönüştürmeye çalışırken duvarla karşılaştıysanız, yalnız değilsiniz.

Bu blog yazısında, bu dönüşüm sırasında karşılaşılan yaygın bir sorunu inceleyecek ve bunu etkili bir şekilde nasıl ele alacağımızı keşfedeceğiz.

Sorun

.NET DataSet’inizi bir XML akışına dönüştürmeye çalışıyorsunuz, bellekte bir XSL dönüştürmesi uyguluyor ve değiştirilmiş XML’i yeni bir dosyaya yazmak istiyorsunuz. Ancak, görünüşte veri içermeyen bir StreamReader‘dan XmlReader oluşturduğunuzda zorluklar ortaya çıkıyor.

Denediğiniz kodun kısa bir özeti şöyle:

BufferedStream stream = new BufferedStream(new MemoryStream());
DataSet ds = new DataSet();
da.Fill(ds);
ds.WriteXml(stream);

StreamReader sr = new StreamReader(stream, true);
stream.Position = 0; // Okuma için konum sıfırla

XmlReader reader = XmlReader.Create(sr, null); // Sorun burada meydana geliyor

Ana sorun, StreamReader‘dan veri tanımadığı için oluşturulan XmlReader‘dır.

Nedenini Anlamak

Kodda belirtilen ana sorunlar şunlardır:

  • Akan Pozisyon Ayarı: StreamReader‘ın akışın başlangıcından okumaya başlaması için akışın konumunu sıfırlamak gereklidir.
  • Akış Kapatma: Verinin bütünlüğü için yazım sonrası akışın düzgün bir şekilde kapatılması veya temizlenmesi oldukça önemlidir.

Çözüm

Mevcut kodunuzdaki sorunları çözmek için basit bir yaklaşım şöyle:

Adım 1: Akış Pozisyonunu Sıfırlayın

StreamReader‘dan okumadan önce, BufferedStream‘in konumunun sıfırlanmasını sağlayın. Bu, Seek yöntemi ile ya da Position özelliğini doğrudan ayarlayarak başarılabilir.

Adım 2: XmlReader’ı Doğru Oluşturun

Akışın uygun şekilde başlangıca yerleştirildiğinden emin olduktan sonra yeni bir XmlReader oluşturun.

Adım 3: Çalışan Kodun Uygulanması

Bu işlemleri nasıl gerçekleştireceğinize dair çalışan bir örnek:

BufferedStream stream = new BufferedStream(new MemoryStream());
stream.Write(Encoding.ASCII.GetBytes("<xml>foo</xml>"), 0, "<xml>foo</xml>".Length);
stream.Seek(0, SeekOrigin.Begin); // Önemli: Akış konumunu sıfırlayın

using (StreamReader sr = new StreamReader(stream))
{
    using (XmlReader reader = XmlReader.Create(sr))
    {
        while (reader.Read())
        {
            Console.WriteLine(reader.Value);
        }
    }
}

Kodun Açıklaması:

  • Akışa Yazma: Burada basit bir XML yapısını akışa yazıyoruz.
  • Pozisyonu Sıfırlama: Seek(0, SeekOrigin.Begin) kullanarak, akış okuyucumuzun başlangıçtan başlamasını sağlıyoruz.
  • XmlReader ile Okuma: XmlReader.Create(sr) XML’i okur ve artık içeriğini çıktılayabiliriz.

Sonuç

Akışı doğru bir şekilde yöneterek ve doğru konuma sıfırlayarak, .Net 2.0/C#‘da StreamReader‘ı XmlReader‘a dönüştürürken karşılaşılan problemleri önleyebilirsiniz. XML ile çalışmak, akış yönetimimize dikkat edersek, .NET’te son derece basit olabilir.

Bu değişiklikleri uygulayın ve XML yönetim yeteneklerinizde belirgin bir iyileşme göreceğinizi umuyorum!