Forum: Projeler turna RSS
XmlElement [Helper'da Ne Kaldı?]
Sayfa:  1  2  3  4  sonraki 
acehreli (Moderatör) #1
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Açıkça kod vermediğimiz için sen bizim kusurumuza bakma. :) Ayrıca hepimiz farklı ölçülerde de olsa deneyimsiziz.

XML elemanının nelerden oluştuğuna bakalım:

<form method="POST" action="/cgi-bin/bir_sey">...</form>

Genel olarak:

<etiket nitelik="degeri" baska-nitelik="onun degeri" ...>...</etiket>

- XML elemanlarında "etiket" diye bir kavram görülüyor; o kavramı ifade etmek için string uygundur (ilgisiz olarak, burada dstring şart değil çünkü bu etiketi olduğu gibi kullanacağız; karakterlerine teker teker erişme işimiz yok. Ama istenirse dstring de olabilir tabii.)

- Ayrıca string="string" düzeninde nitelikler var ve bunlardan çok sayıda bulunabiliyor

- Son olarak, <etiket ...> biçimindeki açma bölümü ile </etiket> biçimindeki kapama bölümü arasına belirsiz sayıda başka XML elemanları gelebilir. Eğer kendi türümüzün ismi XmlElement ise, onları da bir XmlElement dizisi olarak ifade edebiliriz

Aşağıdaki sınıfı derlemedim bile; hataları olabilir. Ama kafamda canlanan türü gösteriyor.

toString() işlevi de bu elemanın dizgi halindeki gösterimini üretebilir:

class XmlElement
{
    string tag;
    string[string] attributes;
    XmlElement[] elements;
 
    override string toString() const
    {
        /*
          1. Açma parantezi; örneğin <form
          2. Nitelikler; örneğin method="POST" action="..."
          3. Açma parantezinin kapatılması: ...>
          4. Form'un içindeki diğer elemanlar; örneğin
              <form ...><B>Koyu metin</B>
                        <P>Benim paragrafım.</P>
                        ...
          5. Kapama parantezi; örneğin ...</form>
         */
    }
}

Kadir Can, sence mantıklı mı? Kafana yatmayan yerlerini konuşalım. :)

Bunu veya benzeri bir tür kullanırsak ona addElement() gibi bir üye işlev veririz ve kendi alt elemanlarını öyle ekleyebiliriz:

    benimEleman.addElement(başkaEleman);

Ali
Kadir Can #2
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Benim aklıma yattı.Bu hale getirmeye çalışacağım.

Teşekkürler.
Kadir Can #3
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ali bey;
Ben class kullanımında o kadar iyi değilim.Biraz çalışmam gerek.Acaba bekleyebilir miyiz?

Acelesi varsa ben karışmayayım.Acelesi yoksa kodları mis gibi yazarım.
canalpay (Moderatör) #4
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ben class kullanımında o kadar iyi değilim.Biraz çalışmam gerek.Acaba bekleyebilir miyiz?

Acelesi varsa ben karışmayayım.Acelesi yoksa kodları mis gibi yazarım.

Zaten herkesin kendi deposu olduğu için sorun değil bence. İstediğin gibi istediğin an yazabilisin yazabilirsin.
acehreli (Moderatör) #5
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #3
Hiçbir şeyin acelesi yok tabii. :)

Kadir Can:
Biraz çalışmam gerek

Nasıl çalışıyorsun? Eğer D.ershane'nin bölümlerini okuyorsan ve anlamadığın yerler oluyorsa bu benim için çok önemli. Eğer koptuğun bir cümle olduysa, örneğin güzel güzel anlarken birden bir noktada kafan karıştıysa lütfen bana hangi cümlede takıldığını söyle.

Genel olarak programlama ile ilgili bir sorunsa zaten nerede soracağını biliyorsun. :)

Ali
Kadir Can #6
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Hepinize teşekkür ederim.Class dersine çalışıp yazmaya başlayacağım.
acehreli (Moderatör) #7
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Sınıflar şu bölüm:

  http://ddili.org/ders/d/siniflar.html

Onun başlarında yapılar üzerinde anlattığım başka bölümlere de gönderme yapmışım. Ama onların hepsi şart değil. Bence şu sırayla okumalısın:

  Yapılar: http://ddili.org/ders/d/yapilar.html
  Üye İşlevler: http://ddili.org/ders/d/uye_islevler.html
  Kurucu ve Diğer Özel İşlevler: http://ddili.org/ders/d/ozel_islevler.html

Hatta bence sınıflara da gerek olmayabilir. Yukarıdaki üç bölüm bence şimdilik yeterli.

Ali
Kadir Can #8
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ali Bey;
Gösterdiğiniz özene gerçekten çok teşekkür ederim.

Okuldaki öğretmenlerim bile bu kadar özenli davranmıyor.

Dediğiniz sıraya da uyacağım.
Kadir Can #9
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Sanırım şöyle bir yapı istiyoruz.Doğru mudur?

import std.stdio;
struct XmlElement{
    string tag;
    string[string] attributes;
    XmlElement[] elements;
 
    void showCode(){
        write("<",tag," ");
        for( int i = 0 ; i < attributes.length ; i++ ) {
            write(attributes.keys[i],"=","\"",attributes.values[i],"\"");
        }
    }
}
 
void main(){
 
    XmlElement eleman;
 
    XmlElement diğer;
 
    eleman.tag="a";
 
    eleman.attributes=["title":"merhaba"];
 
    diğer.tag="b";
 
    eleman.elements=[diğer];
    
    eleman.showCode();
}

Bu temel kısmı tabi ki.Daha çok şey yapılacak ama gidiş yolum nasıl sizce?
acehreli (Moderatör) #10
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Temelde çok güzel. Bir kaç gözlem:

- elements için bir foreach döngüsü daha iyi olur:

    foreach (key, value; elements)

(Derlemedim ama öyleydi.)

- Diğer konuda da söylediğim gibi, showCode() yerine string döndüren bir toString() daha kullanışlı olacak. Ama sonra düzeltilebilir.

Ali
Kadir Can #11
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Doğru söylemişsiniz.foerach kullanarak düzelteceğim.
erdem (Moderatör) #12
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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 <kitabevi> ve <kitap> eleman içerikleri var çünkü diğer elemanları içeriyorlar. <kitap>'ın ayrıca bir niteliği var (kategori="ÇOCUK")  <isim> <yazar> <yıl> ve <fiyat> 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 mesaj erdem tarafından değiştirildi; zaman: 2011-04-16, 13:38.
Kadir Can #13
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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();
}
acehreli (Moderatör) #14
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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 mesaj erdem tarafından değiştirildi; zaman: 2011-04-16, 13:43.
erdem (Moderatör) #15
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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());
}
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Sayfa:  1  2  3  4  sonraki 
Forum: Projeler turna RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-21, 09:19:22 (UTC -08:00)