Makale Özeti

Yazılım Geliştiriciler olarak hepimiz birçok veri tabanı sistemleri ile çalışmışızdır. Ve hepimizin -her ne kadar syntax ı değişsede- kullandığı ortak isimli bir sorgu diliydi SQL. Evet syntax farklıydı ancak amaç ve sonuç aynıydı. Bize verilen yapılandırılmış bir data yı sorguluyor istediğimiz kriterlerde veriler üzerinde işlem yapabiliyorduk.

Makale

XQuery Kullanarak XML Data Sorgulamak

XML konusuna oldukça önem veriyoruz. Bu tutumumuzun sebebini defalarca açıklamaya çalıştık. "Neden XML?" sorusunun karşılığı olan cevapları ayrı bir makale olarak zaten açıklamaya çalışmıştık.

Yazılım Geliştiriciler olarak hepimiz birçok veri tabanı sistemleri ile çalışmışızdır. Ve hepimizin -her ne kadar syntax ı değişsede- kullandığı ortak isimli bir sorgu diliydi SQL. Evet syntax farklıydı ancak amaç ve sonuç aynıydı. Bize verilen yapılandırılmış bir data yı sorguluyor istediğimiz kriterlerde veriler üzerinde işlem yapabiliyorduk.

Peki hep XML den bahsediyoruz, harika olduğunu (:, yeni nesil teknoloji olduğunu ve ortak bir platform olduğunu söylüyoruz veri iletişimi konusunda; ancak XML içinde SQL çalıştırabilir miyiz? Malesef bu sorunun cevabı "Hayır!". Evet XML içinde bildiğimiz yapıda SQL cümlecikleri çalıştıramıyoruz bunun yerine bazı yazılım geliştiriciler XPath veya XSLT kullanabiliyorlar. XPath belirtilen XML dosyasının belirli kritere uyan belli bir parçasını görüntülemek için kullanılabilen bir çeşit syntax. XSLT ise XML dokumanın dönüşümlerinde kullanılan bir teknoloji. Ancak bizim bu yazımızda ele alacağımız teknoloji XQuery.

XML Query yada bizim yazı içinde de devamlı kullanacağımız kısaltılmış ismi ile XQuery; sadece XML dokumanlar içinde yapısal sorgulama yapmak için 2003 Temmuzundan beri piyasada olan ve piyasaya Microsoft tarafından sürülmüş olan bir Sorgulama Dili(Querying Language)

Şimdi harddisk durumumuzu klasör ve dosya türünden kısmen içeren bir XML dosyası hazırlayalım ve bunun üzerinde sorgularımızı çalıştırmayı deneyelim.

Örnek XML Dosya

<?xml version="1.0" encoding="utf-8" ?>
<filesystem>
   <drive letter="C">
      <folder name="Program Files" />
      <folder name="JDeveloper">
         <file>jdeveloper.css</file>
         <file>readme.htm</file>
     </folder>
     </folder>
     <folder name="WINDOWS">
     <folder name="System32" />
         <file>win.exe</file>
     </folder>
   </drive>
   <drive letter="D">
     <folder name="Dokumanlar">
     <folder name="Kaynaklar">
        <file>VBS55.chm</file>
        <file>JS.chm</file>
     </folder>
     </folder>
   </drive>
</filesystem>

Şimdi bu XML dosya üzerinde sorgular çalıştıralım ve ekrana gelecek verileri görelim.

Örnek 1:
FileSystem.xml içinde filesytem>drive>C tabındaki verilerden "file" tipinde olanları listeleyelim.

Sorgu:
document("FileSystem.xml")/filesystem/drive[@letter="C"]//file

Sonuç:
<file>jdeveloper.css</file>
<file>readme.htm</file>
<file>win.exe</file>




Örnek 2:
Yukarıdaki sorgunun aynısını çalıştıralım ancak bu kes sonucu bize belirteceğimiz bir node altında versin.

Sorgu:
<MyFiles>
   { document("FileSystem.xml")/filesystem/drive[@letter="C"]//file }
</MyFiles>


Sonuç:
<MyFiles>
   <file>jdeveloper.css</file>
   <file>readme.htm</file>
   <file>win.exe</file>

</MyFiles>

 

Örnek 3:
<folder>
  <name>Quake</name>
  <files>
    <file>quake.exe</file>
<file>README.txt</file>
<file>EULA.txt</file>
  </files>
</folder>

gibi bir sonuç elde etmeye çalışalım.

Sorgu:
for $myNode in document("FileSystem.xml")//folder
where $myNode/@name="Quake"
return
  <folder>
    <name>{string($myNode/@name)}</name>
    <files>
      {$myNode/file}
    </files>
  </folder>

 


Şimdiki örneğimizde de bu sorguları bu şekilde bağımsız değilde bir ASP.Net sayfası içinde nasıl kullanırız sorusuna yanıt arayalım.

Herhangi bir projemizde XQueryi kullanabilmek için öncelikle
Microsoft.Xml.XQuery NameSpace ini projemize dahil etmiş olmamız gerekiyor.

<%@ Import Namespace="Microsoft.Xml.XQuery" %>
<script language="VB" runat="server">
  Sub Page_Load(sender as Object, e as EventArgs)
     Dim col as New XQueryNavigatorCollection()
     col.AddNavigator(Server.MapPath("FileSystem.xml"), "foo")

     Dim query as String
     query = "for $d in document(""foo"")//folder " & _
             "where $d/@name=""Quake"" or count($d/file) >= 2 " & _
             "return <folder>" & _
             "          <name>{string($d/@name)}</name>" & _
             "          <files>{$d/file}</files>" & _
             "       </folder>"

     Dim expr as New XQueryExpression(query)
     lblXML.Text = (expr.Execute(col)).ToXml()
  End Sub
</script>

<xmp>
<asp:Literal runat="server" id="lblXML" />
</xmp>

Evren AYAN
www.evrenayan.net
www.maxiasp.net