Makale Özeti

Bu bölümde ADO.NET'in sunduğu DataSet nesnesi ve XML'i bir arada nasıl kullanabileceğimizi detaylı olarak ele alıyor olacağız..

Makale

Bu bölümde ADO.NET'in sunduğu DataSet nesnesi ve XML'i bir arada nasıl kullanabileceğimizi detaylı olarak ele alıyor olacağız..

XML ve DataSet’ler İle Çalışmak

Şu ana kadar XML dokumanlarının XML Schema ile nasıl doğrulanacağını ve XmlValidationReader sınıfını ele aldık. Bu bölümde ise bir DataSet’in, XML dokumanındaki veriyle nasıl doldurulabileceğini, DataSet içinde yer alan verinin nasıl bir XML dokumanına yazılabileceğini ve DataSet sınıfının XML ile çalışmamızı kolaylaştıran pek çok metodunu ele alıyor olacağız.

XML ve DataSet Yapısı
DataSet, veri kaynağından alınan veriyi barındıran bir yapıdır. Bu veri kaynağı ilişkisel bir veri kaynağı olabileceği gibi, bir XML dokumanı da olabilir. DataSet typed veya untyped yapıda olabilir. Typed DataSet, DataSet sınıfından türetilmiş ve bir XML Schema ile ilişkilendirilmiş DataSet yapısıdır. UnTyped DataSet yapısında ise bir XML Schema yer almamaktadır. Bir Typed DataSet’te, XSD dosyasında değişiklik yaparak DataSet yapısını etkileybilirsiniz. XML Schema, Typed DataSet görünümüne oldukça yakındır ve her ikiside XSD dosyası olarak XML designer’dan erişilebilir durumdadır. DataSet'e bir XML dokumanı yüklediğimiz zaman, XML Schema XML dokumanından alınan veriyi doğrular. XML Schema ilişkisel yapıya dair tablolar, constraintler ve ilişkiler gibi XML dokumanını doğrulamada önemli olan tüm bilgileri içermektedir. Bu bilgi bir XSD dosyasında saklanır. .NET Framework XSD dosyalarını DataSet nesnesi için veri oluşturmakta kullanır.

DataSet nesnesi, XML ile çalışmamızı kolaylaştıran pek çok metod sunmaktadır. Aşağıdaki tablo bu metodları ve açıklamalarını içermektedir.

Metod Açıklama
GetXml Bu metod DataSet içindeki bir string değişkendeki veriyi XML formatında almamızı sağlar.
GetXmlSchema Bu metod DataSet içinde yer alan verinin XSD Schema’sını almamızı sağlar.
InferXmlSchema Bu metod textReader, XmlReader veya Stream nesneleri tarafından sunulan schema’yı kullanarak DataSet içinde yer alan verinin yapısını edinmemizi sağlar.
ReadXml Bu metod DataSet içindeki XML verisini ve Schema’yı okur.
ReadXmlSchema Bu metod DataSet içindeki XML Schema’yı okur.
WriteXml Bu metod DataSet içindeki veriyi XML dosyasına yazmamızı sağlar.
WriteXmlSchema Bu metod DataSet içindeki veriyi bir XML Schema’ya yazmamızı sağlar.

XML Dosyaları ve DataSet Nesnesi İle Çalışmak

ADO.NET’i, veriyi XML dosyaları ile DataSet nesnesi arasında transfer etmek için kullanabiliriz. ADO.NET aynı zamanda DataSet içindeki veriyi XML verisi veya XML Schema olarak bir dosyaya yazma ve görüntüleme imkanı verir.

Veri Kaynağından DataSet’e  Veri Yüklemek

DataSet nesnesine veri yüklemek için DataAdapter sınıfının Fill metodunu kullanırız. Aşağıdaki örneği incelersek Northwind veritabanının Products tablosunun içeriğini DataSet’e yüklemek istiyoruz. Bunu gerçekleştirmek için önce SQL Server’a SqlConnection sınıfını kullanarak bağlanıyoruz. Sonra SqlDataAdapter sınıfının Fill metodunu kullanarak verileri DataSet’e aktarıyoruz.

Try

     Dim RowCount As Integer

     Dim c As SqlConnection

     c = New System.Data.SqlClient.SqlConnection( _

         "user id=sa;password=;initial catalog=Northwind; " & _

         "data source=localhost")

     c.Open()

   Dim AdapObj As SqlDataAdapter = New SqlDataAdapter("Select * from " & _

                "Products", c)

     Dim dS As New DataSet

     AdapObj.Fill(dS, "ProdTable")

     RowCount = dS.Tables("ProdTable").Rows.Count

     Console.WriteLine(RowCount.ToString)

     Console.ReadLine()

Catch e As Exception

     Console.WriteLine(e.Message.ToString)

     Console.ReadLine()

End Try

Yukarıdaki kodda DataAdapter nesnesinin Fill metodu kullanılarak DataSet içindeki ProdTable adlı tabloya veriler yüklenmiştir.

DataSet İçindeki Verinin XML Olarak Yazılması

DataSet sınıfında yer alarak DataSet içindeki verileri XML formatında dosyalara yazabiliriz. .NET Framework XML verisini bir Schema ile veya Schema olmadan yazma imkanı verir. DataSet verisini XML olarak yazdığımızda DataSet içindeki en güncel veri yazılır ancak ADO.NET DataSet içindeki satırlarda yer alan verinin hem orjinal hem en son hali anlamına gelen DiffGram yazmamıza olanak tanır.

DiffGram
DataSet içerdiği verinin tüm versiyonlarını saklamak için bir DiffGram kullanır. DiffGram XML formatındadır. DiffGram’ı, verinin orjinal ve güncellenmiş versiyonlarını kıyaslamak amacıyla kullanabiliriz. DataSet’i Diffgram olarak yazdığımız zaman, DiffGram DataSet’in içeriğini yeniden oluşturmak için ihtiyaç duyacağımız tüm bilgileri içerecek şekilde güncellenir. Bu içerik satırların ilk hali ve şu anki hallerini, hata bilgilerini ve satırların sıralarını içerir. DataSet DiffGram’ı aynı zamanda verileri network üzerinde iletmek için serialize etmekte kullanır. Şimdi bir XML dosyasını okumayı ve yazmayı ele alacağız.

GetXml() ve WriteXml() Metodları
GetXml() metodunu DataSet içindeki veriyi XML formatında almak için kullanırız, söz dizimi aşağıdaki gibidir;

        Dim XmlData As String

        XmlData = AuthorsDataSet.GetXml()

Yukarıdaki örnekte gördüğünüz gibi GetXml metodu, DataSet içindeki String formatındaki veriyi XML formatında almak için kullanılıyor. Aynı şekilde DataSet içindeki verinin XML formatında XmlWriter’a, bir stream’e veya bir dosyaya yazılması için WriteXml metodunu kullanırız. WriteXml metodu iki parametre alır. İlk parametrenin belirtilmesi zorunludur ve XML çıktısının hedefini belirtir. İkinci parametre ise opsiyoneldir ve XML çıktısının nasıl yazılacağını belirtir. WriteXml metodunun ikinci parametresi aşağıdaki üç değerden birini alabilir;

-         IgnoreSchema; Varsayılan seçenektir ve DataSet’in içeriğinin XML olarak yazılmasını sağlar.

-         WriteSchema; DataSet’in içeriğini ve Schema’sını XML olarak yazılmasını sağlar.

-         DiffGram; DataSet’i DiffGram olarak yazmak için kullanılır.

XmlWriteMode.WriteSchema, WriteXml metodunun ikinci parametresidir ve DataSet’in içeriğinin ve Xml Schema’nın yazılmasını sağlar. Aşağıdaki kod bu işlemi örneklemektedir.

Dim c As SqlConnection

c = New SqlConnection("user id=sa;pwd=;initial " & _

    "catalog=Northwind;data source=localhost;")

c.Open()

Dim AdapObj As SqlDataAdapter = New SqlDataAdapter("Select * from " & _

            "Products", c)

Dim dS As DataSet = New DataSet

AdapObj.Fill(dS, "ProdTable")

dS.WriteXml("Products.xml", XmlWriteMode.WriteSchema)

Bu örnekte yaptığımız gibi verileri yazmak için XML dosyası belirtmek yerine verileri aynı zamanda bir System.IO.StreamWriter nesnesine de gönderebiliriz. Aşağıdaki kod bu işlemi örneklemektedir;

Dim XmlStream As System.IO.StreamWriter

XmlStream = New System.IO.StreamWriter("Authors.xml")

AuthorsDataSet.WriteXml(XmlStream, XmlWriteMode.WriteSchema)

XML Verisini DataSet’e Yüklemek
.NET Framework DataSet’e XML’den yüklenecek verinin seçilebilmesi imkanını sunar. DataSet nesnesinin ReadXml metodunu kullanarak verileri bir XML dosyasından veya stream’den yükleyebiliriz. Ek olarak ReadXml metodu XML verisini bir dosyadan, stream’den veya XmlReader nesnesinden okur. Bu metod iki parametre alır: XML veri kaynağı ve XmlReadMode parametreleri. Burada da ilk parametrenin belirtilmesi mecburi iken ikinci parametrenin belirtilmesi opsiyoneldir. XmlReadMode parametresi için şu seçenekleri kullanabilirsiniz:

-         Auto: Bu seçenek XML dokumanını veya stringi inceler ve seçenekleri belirli bir sıra ile seçer. Bu seçenek eğer XML bir DiffGram ise DiffGram, XML bir inline veya DataSet schema içeriyorsa ReadSchema, XML bir inline schema veya DataSet schema içermiyorsa InferSchema seçeneğini kullanır.

En iyi sonuç için okunacak verinin fomatını bildiğimiz durumlarda Auto yerine doğru XmlReadMode seçeneğini kullanmamız gerekir.

-         ReadSchema: Bu seçenek inline schema'yı okur ve schema ve veriyi DataSet'e yükler. Eğer DataSet zaten bir schema içeriyorsa inline schema'daki yeni tablolar varolan DataSet'e yüklenirler. Inline-schema'daki zaten varolan tablolar için exception oluşturulur.

-         Fragment: Bu seçenek XML parçalarını stream'in sonuna ulaşılana kadar okumaya devam eder. DataSet ile eşleşen parçalar ilgili tablolara eklenir, eşleşmeyenler ise dikkate alınmaz.

-         IgnoreSchema: Bu seçenek inline schema'yı dikkate almaz ve veriyi varolan DataSet schema'sına yazar. Bu seçenek varolan schema ile uyuşmayan verileri dikkate almaz ancak DataSet herhangi bir schema içermiyorsa hiç bir veri yüklenmez.

Eğer XML verisi DiffGram formatındaysa IgnoreSchema opsiyonu DiffGram opsiyonu şeklinde çalışır.

-         InferSchema: Bu seçenek inline schema'yı dikkate almaz ve veriyi DataSet'e yüklemeden önce schema'yı XML verisinin formatına bağlı olarak yorumlar. Yeni tablolar varolan schema'ya eklenir ancak eklenecek tablolar DataSet schema içinde yer alıyorlarsa exception oluşturulur. Ek olarak eklenecek sütunlar schema tablolarında yer alıyorsa yine exception oluşturulur.

-         DiffGram: Bu seçenek bir DiffGram okur ve veriyi schema'ya yazar. Eğer unique identifier değerleri eşleşirse DiffGram opsiyonu yeni satırları eski satırlar ile birleştirir.

Özet Olarak;

-         Çoğu sistem metin tabanlı veriyi yorumlayabildiği için XML, IT sektöründe en çok tercih edilen iletişim standardıdır. XML dosyalar W3C tarafından belirlenen standartlar doğrultusunda oluşturulur.

-         XML DOM sınıfı bellekte yer alan bir XML dokumanının temsilidir. DOM sınıfı XML dokumanını okuma, yazma ve içeriğini değiştirmemizi sağlar. DOM bir XML dokumanının içinde hareket ederek ihtiyaç duyduğumuz verileri almamızı sağlayan çeşitli sınıflar içerir. Her XML dokumanı parent ve child node’lardan oluşur.

-         System.Xml namespace’i XmlReader ve XmlWriter sınıflarını sunarak stream veya XML dokumanları gibi kaynaklardan gelecek XML verilerini parse etmemizi veya yazmamızı sağlar. Bu sınıflar abstract sınıflardır ve kendi ihtiyaçlarımız doğrultusunda yeni sınıfları bu sınıfları temel alarak oluşturabiliriz.

-         XmlReader sınıfı XML verilerine XML dokumanından veya bir stream’den erişme imkanı verir. Bu sınıf hızlı, önbelleklenemez, read-only ve forward-only bir yapı sunar.

-         XmlWriter sınıfı Xml Stream’leri oluşturma ve well-formed XML dokumanları oluşturma imkanı veren bir abstract sınıftır. XmlWriter sınıfını bir output stream kullanarak birden çok xml dokumanı yazmak, stream’e geçerli isim ve token’lar yazmak, binary veriyi encode ederek metinsel çıktı yazmak, çıktıyı yönetmek gibi işlemler yapmak için kullanabiliriz.

-         Bir XML dokumanında belirli bir node’a veya node setine erişmek için XPath kullanırız. .NET Framework’un XpathNavigator sınıfı XML dokumanı üzerinde XPath sorguları oluşturma imkanı veren metod ve özellikler sunmaktadır.

-         IXPathNavigable arayüzünü implement eden veri kaynaklarından bir node setini seçmek için XPathNavigator nesnesinin Select metodunu kullanırız. Select metodu, seçilen node'lar arasında ilerlememizi sağlayan XPathNodeIterator nesnesi döner.

-         Geçerli XML dokumanlarının yapısı XSD dosyaları ile belirlenir.

-         SOM schema tanımlamalarını bir dosyadan okumamıza imkan veren sınıflardan oluşur. Ek olarak bu sınıfları kullanarak programatik olarak schema tanımlama dosyaları oluşturabiliriz. Bu SOM sınıfları System.Xml.Schema namespace'inin üyesidirler.

-         XML dokumanının doğruluğunu XmlValidatingReader sınıfını kullanarak sağlayabiliriz. XmlValidatingReader sınıfı DTD, Xml-Data Reduced (XDR) ve XSD schema doğrulama servislerini sağlayarak XML dokumanının veya XML dokumanı içindeki bir bölümün doğruluğunu denetlememizi sağlar.

-         Bir XML dokumanını DataSet'e yüklediğimizde, XML Schema, Xml dokumanından okunan veriyi doğrular. XML Schema ilişkisel yapıya ait, tablolar, constraintler ve ilişkiler gibi XML dokumanının doğrulanması için önemli tüm bilgileri içerir. Bu bilgi bir XSD dosyasında saklanır. .NET Framework XSD dosyalarını DataSet nesnesi içinde ilişkisel yapıyı oluşturmak için kullanır.

Örnek Uygulama : XML Verisinin Okunması ve Veri Üzerinde İşlem Yapılması

Bu bölümde şu ana kadar ele aldığımız konuların geneli kapsayan bir örnek üzerinde ilerleyeceğiz. İlk adımda ürün bilgilerini içeren bir products.xml dosyası oluşturacağız. Bu dosya ürünlerin ID, Name ve Price bilgilerini içerecektir. XML dokumanı aşağıdaki gibidir;

<?xml version="1.0" standalone="yes"?>

<products>

    <product>

        <id>100</id>

        <name>Football</name>

        <price>50</price>

    </product>

    <product>

        <id>101</id>

        <name>Baseball</name>

        <price>15</price>

    </product>

    <product>

        <id>102</id>

        <name>Bat</name>

        <price>45</price>

    </product>

    <product>

        <id>103</id>

        <name>Ball</name>

        <price>10</price>

    </product>

    <product>

        <id>104</id>

        <name>Glove</name>

        <price>25</price>

    </product>

    <product>

        <id>105</id>

        <name>Helmet</name>

        <price>75</price>

    </product>

</products>

İkinci adımda bu xml dosyasındaki verileri görüntüleyen ve veriler üzerinde değişiklik yapmamızı sağlayan bir windows uygulaması geliştireceğiz. Uygulamamız DataSet ve XmlDataDocument nesnelerini kullanarak verilerin ilişkisel ve XML temsillerini barındıracak. Verilerin ilişkisel formatı DataGrid, XML formatı ise TextBox üzerinde görüntülenecektir.

Uygulama çalıştığında, form’un load olayında products.xml dosyası okunacak ve bir DataSet nesnesi oluşturulacaktır. Form’un load olayı aynı zamanda DataSet ile senkronize edilmiş bir XmlDataDocument nesnesi oluşturacaktır. Ürün bilgilerini textbox kontrolünde görüntülenen XML verisinden veya DataGrid aracılığıyla güncelleyebilir, yeni veri ekleyebilir veya varolanları silebiliriz. XmlDataDocument DataSet nesnesi ile senkronize olduğundan DataGrid nesnesinde yapılacak her değişiklik XML verisini gösteren textbox’ta otomatik olarak güncellenecektir aynı şekilde textbox’ta yapılacak değişiklikler de DataGrid kontrolünde görüntülenen verilerin kendiliğinden güncellenmesini sağlayacaktır.  Ek olarak ürünleri ID veya İsim değerlerine göre arayabileceğiz. Aşağıdaki grafik uygulamanın tasarım zamanı görünümüdür;

Bu uygulamayı oluşturmak için sırasıyla aşağıdaki adımları izleyebilirsiniz.

Visual Studio’yu açın, Yeni bir windows projesi oluşturun, oluşturulan form1’in kodlarını görüntüleyin ve ekrandaki tüm (windows forms designer generator code bloğu dahil) kodları silerek aşağıdaki kodları yapıştırın;

Imports System.IO

Imports System.Xml

Imports System.Xml.XPath

 

Public Class ProductCatalog

    Inherits System.Windows.Forms.Form

    Private xml_data As XmlDataDocument

    Private relational_data As DataSet

 

 

#Region " Windows Form Designer generated code "

 

    Public Sub New()

        MyBase.New()

 

        'This call is required by the Windows Form Designer.

        InitializeComponent()

 

        'Add any initialization after the InitializeComponent() call

 

    End Sub

 

    'Form overrides dispose to clean up the component list.

    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

        If disposing Then

            If Not (components Is Nothing) Then

                components.Dispose()

            End If

        End If

        MyBase.Dispose(disposing)

    End Sub

 

    'Required by the Windows Form Designer

    Private components As System.ComponentModel.IContainer

 

    'NOTE: The following procedure is required by the Windows Form

    'Designer. It can be modified using the Windows Form Designer. 

    'Do not modify it using the code editor.

    Friend WithEvents Label1 As System.Windows.Forms.Label

    Friend WithEvents Label2 As System.Windows.Forms.Label

    Friend WithEvents Label3 As System.Windows.Forms.Label

    Friend WithEvents GroupBox1 As System.Windows.Forms.GroupBox

    Friend WithEvents RadioButton1 As System.Windows.Forms.RadioButton

    Friend WithEvents RadioButton2 As System.Windows.Forms.RadioButton

    Friend WithEvents Button1 As System.Windows.Forms.Button

    Friend WithEvents DataGrid1 As System.Windows.Forms.DataGrid

    Friend WithEvents Id_TxtBx As System.Windows.Forms.TextBox

    Friend WithEvents Name_TxtBx As System.Windows.Forms.TextBox

    Friend WithEvents Price_TxtBx As System.Windows.Forms.TextBox

    Friend WithEvents Xml_TxtBx As System.Windows.Forms.TextBox

    Friend WithEvents Button2 As System.Windows.Forms.Button

    <System.Diagnostics.DebuggerStepThrough()> _

    Private Sub InitializeComponent()

        Me.Label1 = New System.Windows.Forms.Label

        Me.Label2 = New System.Windows.Forms.Label

        Me.Label3 = New System.Windows.Forms.Label

        Me.Id_TxtBx = New System.Windows.Forms.TextBox

        Me.Name_TxtBx = New System.Windows.Forms.TextBox

        Me.Price_TxtBx = New System.Windows.Forms.TextBox

        Me.GroupBox1 = New System.Windows.Forms.GroupBox

        Me.Button1 = New System.Windows.Forms.Button

        Me.RadioButton2 = New System.Windows.Forms.RadioButton

        Me.RadioButton1 = New System.Windows.Forms.RadioButton

        Me.DataGrid1 = New System.Windows.Forms.DataGrid

        Me.Xml_TxtBx = New System.Windows.Forms.TextBox

        Me.Button2 = New System.Windows.Forms.Button

        Me.GroupBox1.SuspendLayout()

        CType(Me.DataGrid1, System.ComponentModel.ISupportInitialize).BeginInit()

        Me.SuspendLayout()

        '

        'Label1

        '

        Me.Label1.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))

        Me.Label1.Location = New System.Drawing.Point(24, 40)

        Me.Label1.Name = "Label1"

        Me.Label1.Size = New System.Drawing.Size(56, 23)

        Me.Label1.TabIndex = 0

        Me.Label1.Text = "ID"

        '

        'Label2

        '

        Me.Label2.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))

        Me.Label2.Location = New System.Drawing.Point(24, 64)

        Me.Label2.Name = "Label2"

        Me.Label2.Size = New System.Drawing.Size(56, 23)

        Me.Label2.TabIndex = 1

        Me.Label2.Text = "İsim:"

        '

        'Label3

        '

        Me.Label3.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))

        Me.Label3.Location = New System.Drawing.Point(24, 88)

        Me.Label3.Name = "Label3"

        Me.Label3.Size = New System.Drawing.Size(56, 23)

        Me.Label3.TabIndex = 2

        Me.Label3.Text = "Fiyat"

        '

        'Id_TxtBx

        '

        Me.Id_TxtBx.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))

        Me.Id_TxtBx.Location = New System.Drawing.Point(80, 40)

        Me.Id_TxtBx.Name = "Id_TxtBx"

        Me.Id_TxtBx.Size = New System.Drawing.Size(160, 23)

        Me.Id_TxtBx.TabIndex = 3

        Me.Id_TxtBx.Text = ""

        '

        'Name_TxtBx

        '

        Me.Name_TxtBx.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))

        Me.Name_TxtBx.Location = New System.Drawing.Point(80, 64)

        Me.Name_TxtBx.Name = "Name_TxtBx"

        Me.Name_TxtBx.Size = New System.Drawing.Size(160, 23)

        Me.Name_TxtBx.TabIndex = 4

        Me.Name_TxtBx.Text = ""

        '

        'Price_TxtBx

        '

        Me.Price_TxtBx.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))

        Me.Price_TxtBx.Location = New System.Drawing.Point(80, 88)

        Me.Price_TxtBx.Name = "Price_TxtBx"

        Me.Price_TxtBx.ReadOnly = True

        Me.Price_TxtBx.Size = New System.Drawing.Size(160, 23)

        Me.Price_TxtBx.TabIndex = 5

        Me.Price_TxtBx.Text = ""

        '

        'GroupBox1

        '

        Me.GroupBox1.Controls.Add(Me.Button1)

        Me.GroupBox1.Controls.Add(Me.RadioButton2)

        Me.GroupBox1.Controls.Add(Me.RadioButton1)

        Me.GroupBox1.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))

        Me.GroupBox1.Location = New System.Drawing.Point(8, 8)

        Me.GroupBox1.Name = "GroupBox1"

        Me.GroupBox1.Size = New System.Drawing.Size(304, 112)

        Me.GroupBox1.TabIndex = 6

        Me.GroupBox1.TabStop = False

        Me.GroupBox1.Text = "Sorgu Girişi"

        '

        'Button1

        '

        Me.Button1.Location = New System.Drawing.Point(240, 80)

        Me.Button1.Name = "Button1"

        Me.Button1.Size = New System.Drawing.Size(56, 23)

        Me.Button1.TabIndex = 2

        Me.Button1.Text = "Query"

        '

        'RadioButton2

        '

        Me.RadioButton2.Location = New System.Drawing.Point(240, 56)

        Me.RadioButton2.Name = "RadioButton2"

        Me.RadioButton2.Size = New System.Drawing.Size(16, 24)

        Me.RadioButton2.TabIndex = 1

        '

        'RadioButton1

        '

        Me.RadioButton1.Checked = True

        Me.RadioButton1.Location = New System.Drawing.Point(240, 32)

        Me.RadioButton1.Name = "RadioButton1"

        Me.RadioButton1.Size = New System.Drawing.Size(16, 24)

        Me.RadioButton1.TabIndex = 0

        Me.RadioButton1.TabStop = True

        '

        'DataGrid1

        '

        Me.DataGrid1.DataMember = ""

        Me.DataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText

        Me.DataGrid1.Location = New System.Drawing.Point(8, 152)

        Me.DataGrid1.Name = "DataGrid1"

        Me.DataGrid1.PreferredColumnWidth = 101

        Me.DataGrid1.Size = New System.Drawing.Size(303, 128)

        Me.DataGrid1.TabIndex = 7

        '

        'Xml_TxtBx

        '

        Me.Xml_TxtBx.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))

        Me.Xml_TxtBx.Location = New System.Drawing.Point(336, 16)

        Me.Xml_TxtBx.Multiline = True

        Me.Xml_TxtBx.Name = "Xml_TxtBx"

        Me.Xml_TxtBx.Size = New System.Drawing.Size(256, 232)

        Me.Xml_TxtBx.TabIndex = 8

        Me.Xml_TxtBx.Text = ""

        '

        'Button2

        '

        Me.Button2.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))

        Me.Button2.Location = New System.Drawing.Point(336, 256)

        Me.Button2.Name = "Button2"

        Me.Button2.Size = New System.Drawing.Size(256, 23)

        Me.Button2.TabIndex = 3

        Me.Button2.Text = "Değişiklikleri Kaydet"

        '

        'ProductCatalog

        '

        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)

        Me.ClientSize = New System.Drawing.Size(600, 317)

        Me.Controls.Add(Me.Xml_TxtBx)

        Me.Controls.Add(Me.DataGrid1)

        Me.Controls.Add(Me.Price_TxtBx)

        Me.Controls.Add(Me.Name_TxtBx)

        Me.Controls.Add(Me.Id_TxtBx)

        Me.Controls.Add(Me.Label3)

        Me.Controls.Add(Me.Label2)

        Me.Controls.Add(Me.Label1)

        Me.Controls.Add(Me.GroupBox1)

        Me.Controls.Add(Me.Button2)

        Me.MaximizeBox = False

        Me.MaximumSize = New System.Drawing.Size(608, 344)

        Me.MinimizeBox = False

        Me.MinimumSize = New System.Drawing.Size(608, 344)

        Me.Name = "ProductCatalog"

        Me.Text = "Ürün Kataloğu"

        Me.GroupBox1.ResumeLayout(False)

        CType(Me.DataGrid1, System.ComponentModel.ISupportInitialize).EndInit()

        Me.ResumeLayout(False)

 

    End Sub

 

#End Region

 

    Private Sub ProductCatalog_Load(ByVal sender As System.Object, _

        ByVal e As System.EventArgs) Handles MyBase.Load

        ' products verisini DataSet nesnesine yüklüyoruz

        relational_data = New DataSet

        relational_data.ReadXml("..\products.xml")

 

        ' Veriyi Datagrid1'de görüntülüyoruz

        DataGrid1.DataSource = relational_data.Tables(0)

 

        'DataSet'i XmlDataDocument nesnesi ile senkronize ediyoruz

        'DataSet nesnesinde yapılacak her değişiklik XMLDataDocument

        'nesnesine kendiliğinden yansıtılacaktır.

        xml_data = New XmlDataDocument(relational_data)

 

        ' XML verisini Xml_TxtBx nesnesinde görüntülüyoruz.

        Xml_TxtBx.Text = xml_data.InnerXml.ToString

    End Sub

 

    Private Sub Button2_Click(ByVal sender As System.Object, _

        ByVal e As System.EventArgs) Handles Button2.Click

        ' XML verisini Xml_TxtBx nesnesinden okuyarak DataSet nesnesine

        'aktarıyoruz

        Dim xml_reader As New XmlTextReader(New _

            StringReader(Xml_TxtBx.Text))

        relational_data = New DataSet

        relational_data.ReadXml(xml_reader)

 

        ' Yeni bir XmlDataDocument nesnesi oluşturuyoruz.

        xml_data = New XmlDataDocument(relational_data)

 

        ' Değişiklikleri products.xml dosyasına kaydediyoruz.

        relational_data.WriteXml("..\products.xml")

 

        ' Veriyi DataGrid'de görüntülüyoruz

        DataGrid1.DataSource = xml_data.DataSet.Tables(0)

    End Sub

 

 

    Private Sub DataGrid1_CurrentCellChanged(ByVal sender As Object, _

        ByVal e As System.EventArgs) Handles DataGrid1.CurrentCellChanged

        Xml_TxtBx.Text = xml_data.InnerXml.ToString

    End Sub

 

    Private Sub RadioButton1_CheckedChanged(ByVal sender As _

        System.Object, ByVal e As System.EventArgs) _

        Handles RadioButton1.CheckedChanged

        Id_TxtBx.ReadOnly = False

        Name_TxtBx.ReadOnly = True

        Id_TxtBx.Focus()

    End Sub

 

    Private Sub RadioButton2_CheckedChanged(ByVal sender As _

        System.Object, ByVal e As System.EventArgs) Handles _

        RadioButton2.CheckedChanged

        Id_TxtBx.ReadOnly = True

        Name_TxtBx.ReadOnly = False

        Name_TxtBx.Focus()

    End Sub

 

    Private Sub Button1_Click(ByVal sender As System.Object, _

        ByVal e As System.EventArgs) Handles Button1.Click

        If Button1.Text.Equals("Query") Then

            If RadioButton1.Checked Then

                'Yeni bir XPathNavigator nesnesi oluşturuyoruz.

                Dim navigator As XPathNavigator

                navigator = xml_data.CreateNavigator()

 

                ' XPathExpression oluşturarak compile ediyoruz.

                Dim expr As XPathExpression

                Try

                    expr = navigator.Compile("descendant::product[id=" & _

                        Id_TxtBx.Text & "]")

                    ' XPathNavigator nesnesinin Select metodunu çağırıyoruz

                    ' ve Select metodundan dönen XPathNodeIterator'ın referansını

                    ' kaydediyoruz

                    Dim iterator As XPathNodeIterator

                    iterator = navigator.Select(expr)

 

                    ' ID, Name ve Price değerlerini almak için hareket ediyoruz

                    iterator.MoveNext()

                    Dim nav2 As XPathNavigator = iterator.Current.Clone()

                    nav2.MoveToFirstChild()

                    Id_TxtBx.Text = nav2.Value

                    nav2.MoveToNext()

                    Name_TxtBx.Text = nav2.Value

                    nav2.MoveToNext()

                    Price_TxtBx.Text = nav2.Value

                Catch ex As Exception

                    MsgBox("Geçerli bir ürün idsi girin.")

                End Try

 

            ElseIf RadioButton2.Checked Then

                ' Yeni bir XPathNavigator nesnesi oluşturuyoruz.

                Dim navigator As XPathNavigator

                navigator = xml_data.CreateNavigator()

 

 

                ' XPathExpression oluşturarak compile ediyoruz.

                Dim expr As XPathExpression

                Try

                    expr = navigator.Compile( _

                        "descendant::product[name='" & _

                        Name_TxtBx.Text & "']")

 

                    ' XPathNavigator nesnesinin Select metodunu çağırıyoruz

                    ' ve Select metodundan dönen XPathNodeIterator'ın referansını

                    ' kaydediyoruz

                    Dim iterator As XPathNodeIterator

                    iterator = navigator.Select(expr)

 

                    ' ID, Name ve Price değerlerini almak için hareket ediyoruz

                    iterator.MoveNext()

                    Dim nav2 As XPathNavigator = iterator.Current.Clone()

                    nav2.MoveToFirstChild()

                    Id_TxtBx.Text = nav2.Value

                    nav2.MoveToNext()

                    Name_TxtBx.Text = nav2.Value

                    nav2.MoveToNext()

                    Price_TxtBx.Text = nav2.Value

                Catch ex As Exception

                    MsgBox("Geçerli bir ürün adı belirtin. Ürün isimleri " & _

                        "case sensitive dir.")

                End Try

            End If

            Button1.Text = "Temizle"

            GroupBox1.Text = "Sorguyu Temizle"

        Else

            Id_TxtBx.Text = ""

            Name_TxtBx.Text = ""

            Price_TxtBx.Text = ""

            Button1.Text = "Query"

            GroupBox1.Text = "Sorgu Girişi"

        End If

    End Sub

 

End Class

Uygulamanın çalışma zamanındaki görünümü ise aşağıdaki gibidir;

Makalenin üçüncü bölümünde kaldığımız yerden devam ediyor olacağız..

Kaynak: Bu dokuman MCSD Self Paced Training Kit’in “Accessing and Manipulating XML Data” bölümü kaynak alınarak hazırlanmıştır.

Kadir Sümerkent
kadir@sumerkent.com