14 Aralık 2015 Pazartesi

WPF-XmlDataProvider ile Veri Sorgulama

XmlDataProvider sayesinde wpf uygulamalarımızda xml veritabanında bulunan kayıtları okuyup üzerinde sorgular yapabilmekteyiz. Dilerseniz vakit kaybetmeden bu nesnenin nasıl kullanıldığıyla ilgili örnek bir senaryo üzerinden gidelim. Aşağıdaki gibi bir xml veritabanımızın olduğunu düşünelim.

<?xml version="1.0" encoding="utf-8" ?>
<Games>
         <Game ID="1" For="PC">
                 <Name>Pro Evolution Soccer 11</Name>
                 <Price>169$</Price>
         </Game>
         <Game ID="2" For="PS">
                 <Name>Need For Speed Most Wanted </Name>
                 <Price>89$</Price>
         </Game>
         <Game ID="3" For="PS">
                 <Name>Call Of Duty Modern Warfare</Name>
                 <Price>139$</Price>
         </Game>
         <Game ID="4" For="PC">
                 <Name>Fifa 2011</Name>
                 <Price>119$</Price>
         </Game>
         <Game ID="5" For="PS">
                 <Name>Crysis 2</Name>
                 <Price>120$</Price>
         </Game>
</Games>

Xml dosyamızdaki oyunları ve fiyatlarını XmlDataProvider nesnesi ile nasıl çekebileceğimize gözatalım. Öncelikle bir XmlDataProvider nesnesi oluşturup kaynağını verilerimizin bulunduğu xml dosyası olarak göstermemiz gerekmektedir. Xml dosyamızın yerini belirttikten sonra hangi düğümden veri çekeceğimizi belirtmemizi sağlayan XPath özelliğini kullanacağız. Ben verileri listelemek için ItemsControl kullandım. XmlDataProvider nesnesini UserControl'ümün kaynağında tanımladıktan sonra ItemsControl'ün ItemsSource özelliğine atıyorum. Tüm bunları yaptıktan sonra aşağıdakine gibi bir ekran çıktısına sahip oluyoruz.

<Grid>
        <Grid.Resources>
            <XmlDataProvider x:Key="dataResource"
             XPath="Games/Game" Source="GameData.xml"/>
        </Grid.Resources>
        <ItemsControl
         ItemsSource="{Binding Source={StaticResource dataResource}}"
         Width="Auto"
         Height="300">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Border CornerRadius="5"
                            Background="Gainsboro"
                            Margin="5">
                     <StackPanel Margin="10,0,0,0">
                        <TextBlock Text="{Binding XPath=Name}"
                                   Margin="3"
                                   FontWeight="Bold"/>
                        <TextBlock Text="{Binding XPath=Price}"
                                   Margin="3"/>
                     </StackPanel>
                    </Border>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>


Bu ilk ve basit senaryomuzdu.Veritabanımızda her oyun için bir For attribute’ımız var. Her oyunun hangi platform için olduğunu belirtiyor. Peki sadece PC uyumllu oyunları çekmek istersek nasıl yapabiliriz? Yapmamız gereken şey ItemsControl kontrolünün ItemsSource özelliğine xmldataprovider nesnesini geçirirken sorgu eklemek olacak. Bunu da şu aşağıdaki gibi yapabiliriz:

<Grid>
        <Grid.Resources>
            <XmlDataProvider x:Key="dataResource"
                             XPath="Games"
                             Source="GameData.xml"/>
        </Grid.Resources>
        <ItemsControl
            ItemsSource="{Binding Source={StaticResource dataResource},
            XPath=*[@For\=\'PS\']}"
                      Width="Auto"
                      Height="300">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Border CornerRadius="5"
                            Background="Gainsboro"
                            Margin="5">
                     <StackPanel Margin="10,0,0,0">
                        <TextBlock Text="{Binding XPath=Name}"
                                   Margin="3"
                                   FontWeight="Bold"/>
                        <TextBlock Text="{Binding XPath=Price}"
                                   Margin="3"/>
                     </StackPanel>
                    </Border>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>

Burada dikkat etmeniz gereken bir şey daha var. XmlDataProvider nesnemizdeki XPath=”Games/Game” sorgumuzu XPath=”Games” olarak değiştirdik. Çünkü sorgulama yaptığımız attribute sayesin hangi elementler üzerinde işlem yapacağı otomatik olarak tanımlanıyor. Sadece playstation için olan oyunları listelettiğimizde aşağıdaki ekran görüntüsüne sahip oluyoruz.
xmldataproviderwithquery

 Aşağıda örnek sorgu çeşitlerini bulabilirsiniz:
 ID’si 4’ten büyük ve PS için olan oyunlar *[@For\=\'PS\' and @ID\>\'4\']
 Hem PS için olan oyunları hem de ID’si 4 olan oyunu getirir *[@For\=\'PS\']|*[@ID\=\'4\']

Hiç yorum yok: