April 13, 2011

Doğru söylemişsiniz.foerach kullanarak düzelteceğim.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 16, 2011

Bundan sonra bu konuda ben de Kadir Can'a elimden geldiğince yardım etmeye karar verdim. Aslında ben de bu konuyu tam olarak bilmiyorum. Beraber öğrenmiş oluruz :)

XML hızlı, kolay ve ortamdan bağımsız olarak çalıştığı için aklımıza gelebilecek hemen her türlü uygulamada kullanılıyor. Eğer D dili ögrenmeye başlamasaydım büyük ihtimal World of Warcraft için eklenti yazıyor olabilirdim. World of Warcraft da yoğun olarak XML teknolojisini kullanıyor.

XML elemanlarının daha kolay anlaşılabilmesi için internette rastladığım bazı bilgileri sizinle paylaşayım dedim.

Bir Xml elemanı elemanın başlangıç etiketinden bitiş etiketine kadar olan herşey olmuş oluyor.

Bir Xml elemanı:

  • diğer elemanları
  • metin
  • nitelik
  • ya da bunların bir karışımını içerebiliyor

<kitabevi>
 <kitap kategori="ÇOCUK">
   <isim>Harry Potter</isim>
   <yazar>J K. Rowling</yazar>
   <yıl>2005</yıl>
   <fiyat>29.99</fiyat>
 </kitap>
 <kitap kategori="WEB">
   <isim>XML Öğrenmek</isim>
   <yazar>Erik T. Ray</yazar>
   <yıl>2003</yıl>
   <fiyat>39.95</fiyat>
 </kitap>
</kitabevi>

Örneğin yukarıdaki örnekte ve 'eleman' içerikleri var çünkü diğer elemanları içeriyorlar. 'ın ayrıca bir 'niteliği' var (kategori="ÇOCUK") <yıl> ve 'metin içeriğe' sahip çünkü metin bilgiler içeriyorlar.

'Kaynak:' http://www.w3schools.com/XML/xml_elements.asp

Bu yüzden sınıf tasarımı gayet güzel olmuş.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 16, 2011

Teşekkür ederim.Kodu en son şu hale getirdim.

import std.stdio;
struct XmlElement{
   string tag;
   string[string] attributes;
   string context;
   XmlElement[] elements;

   void show(){
       write("<",tag);
       foreach( keys , values ; attributes ) {
           write(" ",keys,"=","\"",values,"\"");
       }
       write(">");
       write(context);
       for( int j = 0 ; j < elements.length ; j++ ) {
           elements[j].show();
       }
       write("</",tag,">");
       scope (exit){
       writeln();
       }
   }

   void addElement(XmlElement element ){
   elements ~= element;
   }
}

void main(){

   XmlElement eleman,diğer,öbürü,birDiğeri;

   eleman.tag="a";

   eleman.attributes=["href":"merhaba","link":"hello"];

   eleman.context = "Merhaba";

   diğer.tag="b";

   diğer.context = "Diğer";

   öbürü.tag = "c";

   öbürü.context = "Öbürü";

   birDiğeri.tag = "i" ;

   eleman.elements=[diğer,öbürü];

   eleman.addElement(birDiğeri);

   eleman.show();
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 16, 2011

Hımm. Benim aklıma şöyle bir şeyler geldi. Aslında monitöre alışabilsem :cool: daha da yazabileceğim ama monitör problemim olduğu için bu kadar yazabiliyorum.

import std.stdio, std.string;


struct XmlElement {
   string name;

   string tag;
   string[string] attributes;
   XmlElement[] elements;

   string toString () const {
       string result;
       result ~= "<";
       result ~= tag;

       if (attributes.length > 0) {
           foreach (key, value; attributes)
               result ~= format(` %s="%s"`, key, value);
       }

       result ~= ">";
       result ~= "</";
       result ~= tag;
       result ~= ">";

       return result;
   }
}


void main () {
   XmlElement element;
   element.tag = "kitap";
   element.attributes = ["kategori":"ÇOCUK"];

   writeln(element.toString());
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 16, 2011

Daha da güzel. :)

Notlar:

  • Kod düzeni konusunu başka konular kadar önemli değil ama bu konuda daha anlaşamadık ;)

  • foreach'te keys ve values yerine key ve value demek daha doğru olur; çünkü her dönüşte tek key ve tek value var

  • show(), yalnızca standart çıkışa yazdırabiliyor. Onu, string döndüren toString() diye bir işleve dönüştürürsek XML elemanının metin halini string geçen her yerde kullanabiliriz. Örneğin bir dosyaya bile yazdırabiliriz

Onu şöyle halledebiliriz:

string toString() const
{
   string sonuç;

   // ...

   // örneğin:
       sonuç ~= format(` %s="%s"`, key, value);

  // Ek not: Ters tırnak kullanılırsa çift tırnakların
  //         öncesine ters bölü gerekmez.

   return sonuç;
}
  • Özel bir nedenin yoksa j++ yerine her zaman için ++j yazmalısın. Çünkü amacın "j'yi arttırmak". j++ yazdığın zaman "j'yi arttır ama önceki değerini kullan" demiş oluyorsun. Özellikle onu demek istemiyorsan her zaman için ++j yazılmalı. (Bu konu C ve C++ programcıları için de geçerlidir.)

  • Ve tabii eğer elements döngüsünü de foreach ile yazarsan önceki maddenin bir önemi kalmıyor. :)

  • scope(exit) konusunu tekrar düşündüm. Yukarıdaki koddaki kullanımı amacına tam uymuyor, çünkü zaten o kapsamdan çıkmak üzereyiz. Eğer o noktaya gelmişsek zaten writln() işletilecektir. scope(exit), kapsamın çok daha önceki bir noktasında yazılırsa anlamlı olur. Örneğin şurada:

   write(">");
   scope (exit) {
       write("</",tag,">");
       writeln();
   }

   write(context);

Görüyor musun, açma tag'ini ">" ile kapattığımız an kapama tag'ini de garantiliyoruz. Ancak o garantiden sonra context ve diğer elemanları yazdırıyoruz.

Özetle, scope deyimleri kapsamların önceki noktalarında yazılır. (Dediğim gibi, deneyimim olmadan konuşuyorum ama bildiğim böyle. :) )

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 16, 2011

Evet, fikir o. toString çok özel bir işlev olduğu için açıkça çağırmaya da gerek yok:

   writeln(element);

Görüldüğü gibi bu tür bir çok kütüphane işleviyle de kullanılabiliyor. Hatta elements dizisi de XmlElement olduğu için onları da teker teker ~= ile ekleyebiliriz.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 17, 2011

Bu XmlElement yapısına bakınca aklıma değişik değişik fikirler geliyor.

Böyle bir yapının yapılıp yapılamayacağını bilmiyorum ama sadece rastgele fikirler :)

Örneğin bu XmlElement yapısına bakınca ağaç (tree) gibi bir yapı ortaya çıkıyor. Acaba bu xml sınıfını grafik (graph) nesneleri kullanarak yapabilirmiydik.

Bir de örneğin kitabevi elemanının 2 tane kitap isimli elemanı var. Her elemanın içeriğini sonuçta bir Xml elemanı olduğuna göre kendi başına yazdırması düşünülebilir mi.

'kitabevi'
elemanlar -> kitap çocuk, kitap web

'kitap çocuk'
elemanlar -> isim, yazar, yıl, fiyat

Yani kitabevi sadece iki elemanını, nitelik, metin gibi bilgileri bilse ama alt elemanların içeriğinden haberdar olmasa. Alt elemanlar kendi içeriklerini kendileri yazdırsalar. Bu ikincisi biraz karışık oldu galiba :)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 17, 2011

Alıntı (acehreli):

>

Önceden de söylediğim gibi, XmlElement.toString'e, 'foreach (element; elements)' döngüsünü de ekleyince iş tamam... :)

Aslında o kısmı en başından beri biliyorum ;)

Ama projenin hızını gereksiz yere hızlandırmak veya yavaşlatmak istemediğim için o kısmı Kadir Can yazar diye düşünmüştüm. Ben sadece yardımcı programcı olarak takılıyorum :)

Ama örneğin biraz daha yavaş gidelim ya da hızlanalım derseniz o da olabilir benim açımdan..

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 17, 2011

Alıntı (erdem):

>

bu XmlElement yapısına bakınca ağaç (tree) gibi bir yapı ortaya çıkıyor.

Güzel bir gözlem. XmlElement aynen dediğin gibi bir ağaç. 'elements', her düğümün çocukları (veya dalları).

Alıntı:

>

Acaba bu xml sınıfını grafik (graph) nesneleri kullanarak yapabilirmiydik.

Olabilirdi. Ama bu hali de tam ihtiyacımızı karşıladığı için başka türlü veri yapılarına geçmek için bir neden bulmamız gerekecek. :) (Öyle yapalım demediğini biliyorum.)

Alıntı:

>

Bir de örneğin kitabevi elemanının 2 tane kitap isimli elemanı var. Her elemanın içeriğini sonuçta bir Xml elemanı olduğuna göre kendi başına yazdırması düşünülebilir mi.

He he! :) O sorun toString ile çözüldü bile! :)

Alıntı:

>

'kitabevi'
elemanlar -> kitap çocuk, kitap web

'kitap çocuk'
elemanlar -> isim, yazar, yıl, fiyat

Yani kitabevi sadece iki elemanını, nitelik, metin gibi bilgileri bilse ama alt elemanların içeriğinden haberdar olmasa. Alt elemanlar kendi içeriklerini kendileri yazdırsalar. Bu ikincisi biraz karışık oldu galiba :)

Zaten XmlElement aynen öyle çalışıyor (gibi birşey). ;) Önceden de söylediğim gibi, XmlElement.toString'e, 'foreach (element; elements)' döngüsünü de ekleyince iş tamam... :)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 18, 2011

O zaman Kadir Can programcı, ben yardımcı (destek) programcı, Ali bey de *lead software engineer *olmuş oluyor :)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]