Alıntı (acehreli):
> (Aslında işlemler sırasında hata atarak olayı yarıda kesebiliriz ama bu hata atma düzeneğinin nerelerde kullanılmamasının bir örneğidir. Programın normal işleyişini etkilemek için hata atılmaz; hatalı durumlarda atılır.)
Bu fikir benimde aklıma geldi ama seninde belirttiğin sebeple kullanmaktan vazgeçtim.
Alıntı:
> Bu güne kadar bütün XML dosyalarını biz de hep sonuna kadar okumuştuk.
Aslında biraz düşününce öyle olmasının doğru olduğunu görüyorum. XML dosyasının herhangi düzeyinde de durdurabilmeli miyiz? Öyle yaparsak okunan verinin doğruluğu hakkında ne söyleyebiliriz? Bir sonra gelecek olan alt eleman belki de önemlidir.
Doğrusu bende çalıştığım programlarda hep böyle yapıyorum yani dosya sonuna kadar okuyorum ama bizim durumda bu xml dosyası aynı zamanda sistemin veri tabanı gibi davrandiği için örneğin 5_000 kelime içeren bir dosyanın tamamını okumak yerine belki işimize yarar bir kısmını okumak daha güzel olur diye düşünmüştüm ama sanırım şimdilik tamamını okumak daha iyi olacak belki ileride gerekirse başka bir şeyler düşünürüz.
Alıntı:
> Öte yandan bütün dosyayı okumakta hiç sorun da olmayabilir. İlgilenenlere program fikri: içinde çok sayıda "kelime" elemanı bulunan bir XML dosyası oluşturun. (Bunu tabii ki bir D programı ile yapın. ;)) Sonra bunları KelimeListesiHazirla() işlevi ile işleyerek ne kadar zaman geçtiğine bakın.
Program fikri hoşuma gittiği ve ileride XML dosyası ile çalışmalar yapacağım için hazırlık olması açısından bir şeyler kodlamaya çalıştım. Ancak göründüğü kadar kolay değilmiş uğraşılarım sonucu dosyaya yazma işlemini bitirebildim. Aslında takıldığım nokta dosyadaki elemanın en sonuna yeni bir eleman ekleyememek. Yani yeni bir eleman eklediğimde bunu gidip dosyanın en altına ekliyor yani kapanmış olan etiketinin altına böyle oluncada iş bozuluyor tabi. Yani dosya sonuna yeni eleman ekleyemiyorum.
Aslında şu adreste https://github.com/tomeksowi/phobos/blob/master/std/xml.d#L3049 yeni geliştirilen bir XMLWriter sınıfı buldum bir çıkış aralığı ile çalışıyor (OutputRange) ama daha sonra bu geliştirmenin orjinal kütüphanede bulunmadığını farkettim ve vazgeçtim.
Neticede her defasında tüm dosyayı okuyup, eklenecekleri ekleyip dosyayı yeniden yazıyorum ama bu da oldukça yavaşlıyor. Örneğin 1_000 kayıt için denediğimde 950'den sonra artık iyice yavaşlamıştı :) Gerçi biz sadece okuma yapacağız tahminim hızdan dolayı bir sorun olmaz. Yeni eleman ekleme konusunda senin bir bilgin var mı Ali, dosya sonuna yeni eleman ekleme şansımız olursa hem hızın hemde işlerimizin daha kolaylaşacağını düşünüyorum?
Uğraştığım kodlar aşağıda ; Programın çalışması için içeriği boş bir data.xml dosyası çalışma dizininde olmalı.
import std.xml;
import std.stdio;
import std.string;
import std.conv;
import std.random;
enum Seviye { temel, orta, ileri }
struct Kelime
{
Seviye seviye;
string soru;
string[] cevaplar;
string[] zitAnlamlar;
}
void main()
{
Kelime[] kelimeler;
for (int i = 0; i < 100; ++i)
{
kelimeler ~= XmlDosyasiniOku();
kelimeler ~= VerYeniBirKelime();
DosyayaKelimeEkle(kelimeler);
writefln("Eklenen Kelime No : %s", to!string(i));
}
}
Kelime VerYeniBirKelime()
{
//char[] alfabe = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','r','s','t','u','v','y','z'];
string alfabe = "abcdefghijklmnoprstuvyz";
string soru;
for (int i = 0; i < uniform(5, 10); ++i)
{
soru ~= alfabe[uniform(0, 22)];
}
string[] cevaplar;
for (int j = 0; j < 5; ++j)
{
string cevap;
for (int i = 0; i < uniform(5, 10); ++i)
{
cevap ~= alfabe[uniform(0, 22)];
}
cevaplar ~= cevap;
}
string[] zitAnlamlar;
for (int z = 0; z < 5; ++z)
{
string zitAnlam;
for (int i = 0; i < uniform(5, 10); ++i)
{
zitAnlam ~= alfabe[uniform(0, 22)];
}
zitAnlamlar ~= zitAnlam;
}
Kelime kelime;
kelime.seviye = Seviye.temel;
kelime.soru = soru;
kelime.cevaplar = cevaplar;
kelime.zitAnlamlar = zitAnlamlar;
return kelime;
}
void DosyayaKelimeEkle(Kelime[] kelimeler)
{
auto doc = new Document(new Tag("kelimeler"));
foreach(kelime; kelimeler)
{
auto birKelime = new Element("kelime");
birKelime.tag.attr["seviye"] = to!string(kelime.seviye);
auto soru = new Element("soru", kelime.soru);
auto cevaplar = new Element("cevaplar");
foreach (cevap; kelime.cevaplar)
{
cevaplar ~= new Element("cevap", cevap);
}
auto zitAnlamlar = new Element("zit-anlamlilar");
foreach (zitAnlam; kelime.zitAnlamlar)
{
zitAnlamlar ~= new Element("zit-anlam", zitAnlam);
}
birKelime ~= soru;
birKelime ~= cevaplar;
birKelime ~= zitAnlamlar;
doc ~= birKelime;
}
File xmlDosya = File("test.xml", "w");
xmlDosya.writeln("<?xml version=\"1.0\"?>");
xmlDosya.writefln(join(doc.pretty(3),"\n"));
}
Kelime[] XmlDosyasiniOku()
{
Kelime[] kelimeListesi;
string s = cast(string)std.file.read("data.xml");
// XML formatını kontrol et
//check(s);
DocumentParser xml = new DocumentParser(s);
xml.onStartTag["kelime"] = (ElementParser xml)
{
Kelime kelime;
kelime.seviye = to!Seviye(xml.tag.attr["seviye"]);
xml.onEndTag["soru"] = (in Element e) { kelime.soru = e.text; };
xml.onStartTag["cevaplar"] = (ElementParser xml)
{
xml.onEndTag["cevap"] = (in Element e) { kelime.cevaplar ~= e.text; };
xml.parse();
};
xml.onStartTag["zit-anlamlilar"] = (ElementParser xml)
{
xml.onEndTag["zit-anlam"] = (in Element e) { kelime.zitAnlamlar ~= e.text; };
xml.parse();
};
xml.parse();
kelimeListesi ~= kelime;
};
xml.parse();
return kelimeListesi;
}
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]