Makale Özeti

XML ile veri erişimi üzerine önemli ipuçları veren bir makale..

Makale

Turgut HASPOLAT
turguthaspolat@hotmail.com



XML - Data Islands
Bu yazımda sizlere XML Data Island ve DOM (Document Object Model) hakkında kısa bilgi vererek, örnek bir veritabanı uygulaması ile nasıl ve nerelerde kullanabileceğimizi anlatmaya çalışacağım. Bu yazıda anlatılan konular, en az orta seviyede XML, ASP ve SQL bilenlere yöneliktir.

Bildiğiniz gibi Microsoft Internet Explorer 5.0 sürümünden itibaren yer alan XML parser artık direk XML dosyalarını okuyabiliyor ve XSL desteği sunuyor. Bununla berarber Internet Explorer 5.0 ile gelen ve çok sık kullanılan bir kavram daha var o da; " Data Islands ".

XML Data Islands : Bir HTML sayfasında XML komutlarının gömülü olması ve onların işlenebilmesi demektir. Böylece HTML sayfanızın içine artık sadece HTML tagleri değil, aynı zamanda XML komutlarını da yazabilirsiniz.

Data Island iki şekilde HTML sayfalarına gömülür.

     - Direk XML datasını HTMLin içine gömerek
           
      <XML ID="XMLID">
         <iller>
           <ilkod>06</ilkod>
           <İlad>ANKARA</İlad>
         </iller>
      </XML>


     - HTML sayfasından XMLi referans göstererek.

      <XML ID="XMLID" SRC="iller.xml"></XML>


XML verisi nasıl depolanır.
Internet Explorer 5.0, Veri Kaynağı Nesnesi (Data Source Object - DSO) olarak bilinen ve XML verisini depolayan ya da önbellekleyen bir programlama nesnesi yaratır. DSO, XML verisini bir kayıt kümesi olarak başka bir deyişle bir kayıt ve alanlar topluluğu olarak depolar. Bir HTML öğesini bir XML öğesine bağladığınızda, DSO otomatik olarak XML öğesinin değerini sunar ve tüm ayrıntıları işler. Ayrıca DSO, depolanmış kayıt kümesine yöntemler, özellikler ve olaylardan oluşan bir topluluk aracılığı ile doğrudan erişip yönetmenizi de sağlar.

Sayfa içinde Data Island ID özniteliğine atadığınız tanımlayıcı, DSOyu temsil eder. DSO yalnızca simetrik kayıt kümeleri olarak yapılandırılmış XML belgelerini görüntülemek için kullanışlıdır. Bunun yanında Belge Nesne Modeli (Document Object Model - DOM) olarak bilinen programlama modeli vardır. DOM, bir XML belgesinin farklı bileşenlerine karşılık gelen bir programlama nesneleri kümesinden oluşur. XML verisini XML belgesinin hiyerarşik yapısını yansıtacak şekilde ağaç türünde bir hiyerarşi içinde depolar. Bu nedenle herhangi türde bir XML belgesini görüntülemek ve öğeler (elements), öznitelikler (attributes), işlem yönergeleri (Processing Instruction), yorumlar (Comments), varlık (Entity) ve simgesel gösterim bildirimleri (Notation) dahil bir XML belgesinin tüm bilgilerine erişmek için DOMu kullanabilirsiniz.

W3C nin sunmuş olduğu DHTMLden tanıdığımız, XML de kullanılan DOM, platform ve dilden bağımsız yapısı ile, dökümana dinamik olarak ulaşıp, içeriğin gösterilmesinde, update edilmesinde, elemanların ve elemanların özelliklerinin kullanılarak kullanıcının istediği şekilde sunulmasında yardımcı olur. DOM, XML yapısını dallanan bir şekilde (bir eleman, o eleman ait child, childin özellikleri gibi) ele alır ve işler.

DOM, XMLdeki tüm elemanları (elements), elemanların özelliklerini (attributes), varlıkları (Entity) ve tüm bunların değerlerini bir ağaç yapısında oluşturur. Bu yapıdaki herbir noktaya NODE denir.
Tipik bir XML dökümanı, DOCUMENT nodeu ile başlar ve dökümanın köküdür.
XML belgesini HTML sayfasına bağlamak.
DOM kullanarak bir XML belgesine erişmek için, XML belgesini HTML sayfasına bağlamalısınız. Bunu yapmanın en kolay yolu, bir Data Island eklemektir. Bunu yapmak için XML adlı bir HTML öğesi kullanırız.

Örneğin aşağıda HTML sayfası içinde iller.xml adlı XML belgesine bağlanan bir veri adası (Data Island) içermektedir.

      <XML ID="dsoILLER" SRC="iller.xml"></XML>

Data Island atadığınız kimlik (ID) bu örneğimizde dsoILLER, belgenin DSOsuna başvurur. Aşağıdaki komut dosyası kod satırında gösterildiği gibi, DOMa erişmek için DSOnun XMLDocument üyesi kullanılır.

      Document = dsoILLER.XMLDocument

HTML sayfasında Data Island yaratmak, Internet Explore 5in hem DSO hem de DOM yaratmasına neden olur. XML öğelerine erişmenin başka bir yolu belirli bir tür adına sahip tüm öğeleri çıkarmak için getElementsByTagName özelliğini kullanmaktır. Bu yöntem Element düğümlerini bir NodeList topluluk nesnesi biçiminde sağlar.
      objNodeList = dsoILLER.getElementsByTagName("ilad");
Örnek Senaryo :
Tüm bu anlatılanları bir örnek üzerinde kullanarak açıklayacak olursak sanırım XML Data Island nerde nasıl efektif bir şekilde kullanacağımıza ışık tutar. Örneğimizde şöyle bir durum sözkonusu olsun; Veritabanında iller tablosu (il_t_iller) ve bu illere ait belediyeler tablosu (il_t_belediye) var. Bu iki tablo arasında ilişki (relationship) kurulmuş olup il_t_belediye tablosundaki ilkod alanı ile il_t_iller tablosundaki ilkod alanı arasında ile one-to-many ilişki vardır. Yani il_t_iller tablosundaki bir alan il_t_belediye tablosundaki bir çok alana karşılık gelmektedir. Biz ise kullanıcıya bir arama sayfası yapacağız ve bu sayfada İl Adı ve Belediye Adı seçimi yapılması için iki adet Combo Box olacak.
İl Adı referanslı combo boxımız veritabanından il_t_iller tablosu bilgileri ile doldurulacak (populate) ve kullanıcı herhangi bir il adını seçtiğinde Belediye Adı referanslı combo boxımız dinamik olarak o ile ait belediye bilgileri ile doldurulacak.

İşte bu aşamada XML data island ve DOM kullanacağız ve sayfamız yenilenmeden (refresh), diğer yöntemlere göre çok daha hızlı olarak Belediye Adı combo boxımızın nasıl dinamik olarak doldurulacağını göreceğiz.


Kullanıcı öncelikle İl Adı combo boxından herhangi bir il adını seçer. Seçilen il adına göre Belediye combo boxı dinamik olarak o ile ait bilgilerle doldurulur.

Öncelikle dinamik yapıda XML formatında dosya oluşturacak bir ASP sayfası kodlayacağız. ASP sayfamızın adı XMLQuery.asp olsun. Bu ASP sayfası, Arama Sayfası içinden göndereceğimiz SQL sorgu cümlesine göre veritabanına bağlanarak belediyekod ve belediyead alanlarını SELECT edip bir kayıt kümesi oluşturacak. (Aşağıdaki kodda SQL cümlesi örneği olarak command-out strSQL cümlesini inceleyebilirsiniz.)
Aşağıdaki kodda gördüğünüz gibi ana rootta <IL> öğesi (element) yaratıldıktan sonra bir döngü içerisinde <BELEDİYE> öğesi yaratılarak veritabanından dinamik olarak SELECT edilen sütun isimleri ile alt öğe isimleri yaratılır ve değerleri içlerine yerleştirilir.

<% @ Language="VBScript" %>

<%

Response.Buffer = True
Response.ContentType = "text/xml"
Response.Write "<?xml version=""1.0"" encoding=""ISO-8859-9""?>" & vbCrLf

strSQL = Request.QueryString("strQuery")
strSQL = "Select belediyekod, belediyead from il_t_belediye where ilkod=34

set conn = Server.CreateObject("ADODB.Connection")
set rs = Server.CreateObject("ADODB.Recordset")
strConn = "Veritabanı bağlantı cümleniz..."
conn.open strConn
conn.CommandText = strSQL
Set objRS=conn.execute

Response.Write "<IL>" & vbCrLf

  While Not objRS.EOF
    Response.Write "<BELEDIYE>" & vbCrLf
    For Each objField in objRS.Fields
      strName = objField.Name
      strValue = objField.Value
      Response.Write "<" & strName & ">" & vbCrLf
      Response.Write strValue & vbCrLf
      Response.Write "</" & strName & ">" & vbCrLf
    Next
    Response.Write "</BELEDIYE>" & vbCrLf
    objRS.MoveNext
  Wend
Response.Write "</IL>" & vbCrLf

%>




Bu durumda oluşan XML dokümanı Internet Explorer 5.0 (veya sonraki sürümleri) da XMLQuery.asp sayfasını çalıştırarak incelersek.

Oluşturduğumuz <BELEDIYE> öğesinin alt öğeleri dinamik olarak SELECT ettiğimiz alanlardan oluşur ki bunlar belediyekod ve belediyead dır. Değerleri ise yine dinamik olarak veritabanından doldurulur.

Dikkat ediniz <BELEDIYE> alt öğe adları bizim SELECT cümlesinde belirlediğimiz adlardır. SELECT cümlesinde * (tümünü) isteseydik tablonun tüm sütun adları ve değerlerini XML dokümanına yazdırmış olacaktık. Yandaki şekilde dinamik olarak ASP sayfasından elde edilen XML dokümanının bir kısmını görmektesiniz.

Gördüğünüz üzere XMLQuery.asp sayfamız dinamik bir yapıda olacak ve kendisine gönderilecek strQuery sorgu cümleciğini göre bir XML dokümanı oluşturacak. Şimdi ise dinamik oluşacak bu XML dokümanındaki bilgilere nasıl erişeceğimize bakalım. Öncelikle yazının başında kısaca bahsettiğim gibi XML belgesini HTML sayfasına bağlamak için XML tagi kullanarak Data Island oluşturuyoruz ve dsoBELEDIYELER ID kimlik atamasını yapıyoruz.
Daha sonra iller combo boxımıza her il seçiminde tetikleyecek olan onChange eventine bir fonksiyon yazmamız gerekecek. Aşağıda ki kodda gördüğünüz üzere İller combo boxı, kullanıcı seçimine göre tetiklenecek ve populateCombo fonksiyonuna ilkodu parametresini gönderecek.

<!-- Data Island-->
<XML ID="dsoBELEDIYELER"></XML>

<form name="aramaform" ... >

  populateCombo fonksiyonuna seçilen ilkod değeri gönderilir.
 
 <select name="iller" onChange=populateCombo(aramaform.iller.value)>
 
   <option value=""> </option>
    <option value="01">İl bilgileri veritabanından dinamik olarak doldurulur</option>
    .
    .
  </select>


  populateCombo fonksiyonu tarafından dinamik olarak doldurur.
 
 <select name="belediyeler">
 
   <option value=""> </option>
  </select>
</form>


Aşağıda ki populateCombo fonksiyonumuzu inceleyecek olursak; scriptte gördüğünüz gibi gelen ilkodu parametresine göre oluşacak SELECT cümlesini XMLQuery.asp sayfasına QueyrString ile StrQuery değişkeninde gönderilir. Yukarıda da anlatıldığı üzere XMLQuery.asp XML dokümanını oluşturur. Bu oluşan dokümanı XML Data Islanda bağlamak için kimlik ataması yaptığımız dsoBELEDIYELER nesnesinin SRC özelliğine XMLQuery.asp den oluşan XML dokümanı atanır. Böylece dinamik oluşturulan XML dokümanını Data Islanda bağlamış oluruz.

Şimdi ise Data Island içinden öğelere nasıl ulaşabileceğimize bakalım. XML öğelerine erişmek için belirli bir tür adına sahip öğeleri almamızı sağlayan getElementsByTagName özelliğinden bahsetmiştik. Aşağıda gördüğünüz üzere GetElementByTagName metodu kullanılarak <BELEDIYE> elementinin tüm alt elementlerini objNodeListad ve objNodeListkod değişkenlerine atanır. Elde ettiğimiz <BELEDIYE> alt elementlerini ve değerlerini ( <belediyekod> ve <belediyead> ) bir "for" döngüsü içinde DHTML ile "belediyeler" combo box <option> taglerine yazdırırız. Böylelikle iller isimli combo boxtan seçillen ilin kod değeri populateCombo fonsiyonuna gönderilerek oluşan dinamik yapıda o İle ait belediye adları belediyeler isimli combo boxta DHTML ile dinamik olarak yazdırımış olur. Böylelikle kullanıcı her il seçiminde sayfa yenilenmeden combo box yeniden oluşturulur. Script sonunda gördüğünüz "while" döngüsü bir önceki seçimden oluşan fazla değerleri silmek içindir.


<script Language=Javascript>
  function populateCombo(par) {
    var currNode;
    dsoBELEDIYELER.async = false;

    strQuery="Select belediyekod, belediyead from il_t_belediye " &_
             "where ilkod=" + par
    dsoBELEDIYELER.SRC="xmlQuery.asp?strQuery=" + strQuery

    objNodeListad = dsoBELEDIYELER.getElementsByTagName("belediyead");
    objNodeListkod = dsoBELEDIYELER.getElementsByTagName("belediyekod");

    for (var i=0; i < objNodeListad.length; i++) {
    aramaform.belediyeler.options[i]=new     Option(objNodeListad.item(i).text,objNodeListkod.item(i).text);
    }

  
  
while ( objNodeListad.length < aramaform.belediyeler.options.length)
    {
    aramaform.belediyeler.options[(aramaform.belediyeler.options.length - 1)]     = null;
    }
  }
</script>


XML Data Island ve DOM kullanarak verilerinize çok daha hızlı bir şekilde erişebilir ve dinamik bir yapıda kullanabilirsiniz. Özellikle devrim olacak .NET platformu ile web servislerini kullandığımızda XML önemi oldukça fazla ortaya çıkmaktadır. Bu aşamada bilgiyi standart bir formatta, platform bağımsız, hızlı, kolay ve çabuk erişilebilir yapan XML, uygulamalarımızda hızla yer almaktadır. Durmadan yenilenen teknolojilerde XMLi kullanmak ve uygulama alanlarını keşfetmek gerekliliği kaçınılmazdır. Bundan sonraki yazılarımda .NET ve XML Web Servisleri konularında yazmaya çalışacağım.

Öğrenmenin sonu yoktur ancak öğrendiklerimizi uygulamalar üzerinde geliştirmek ve yaratıcı olmak durumundayız. Ancak böylelikle paylaştığımız bilgi büyür. Bir sonraki yazımda görüşmek üzere...


NOT:bu makalenin örnek kodlarını indirmek için tıklayın


Referanslar                                         :
XML Data Island ve DOM hakkında bilgiler
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk30/htm/xmmscxmloverview.asp

Yazıda kullanılan örnek kodlar
http://www.planet-source-code.com
sitelerinden derlenmiştir.