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!