Aracılığıyla paylaş


Nasıl yapılır: XMLDataProvider ve XPath Sorguları Kullanarak XML Verilerine Bağlama

Bu örnekte, XmlDataProviderkullanarak XML verilerine nasıl bağlanacağınız gösterilmektedir.

XmlDataProviderile, uygulamanızdaki veri bağlama aracılığıyla erişilebilen temel alınan veriler herhangi bir XML düğümü ağacı olabilir. Başka bir deyişle, XmlDataProvider herhangi bir XML düğüm ağacını bağlama kaynağı olarak kullanmak için kullanışlı bir yol sağlar.

Örnek

Aşağıdaki örnekte, veriler doğrudan bölümü içinde xml Resources olarak katıştırılır. XML veri adası, <x:XData> etiketleriyle sarılmalı ve her zaman tek bir kök düğüme sahip olmalıdır; bu örnekte bu kök düğüm Inventory’dir.

Uyarı

XML verilerinin kök düğümünde XML ad alanını boş bir dizeye ayarlayan xmlns özniteliği vardır. Bu, XAML sayfasında satır içi olan bir veri adasına XPath sorguları uygulamak için bir gereksinimdir. Bu satır içi durumda, XAML ve dolayısıyla veri adası System.Windows ad alanını devralır. Bu nedenle, XPath sorgularının System.Windows ad alanı tarafından nitelenmesini engelleyerek sorguları yanlış yönlendirecek şekilde ad alanını boş ayarlamanız gerekir.

<StackPanel
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Background="Cornsilk">

  <StackPanel.Resources>
    <XmlDataProvider x:Key="InventoryData" XPath="Inventory/Books">
      <x:XData>
        <Inventory xmlns="">
          <Books>
            <Book ISBN="0-7356-0562-9" Stock="in" Number="9">
              <Title>XML in Action</Title>
              <Summary>XML Web Technology</Summary>
            </Book>
            <Book ISBN="0-7356-1370-2" Stock="in" Number="8">
              <Title>Programming Microsoft Windows With C#</Title>
              <Summary>C# Programming using the .NET Framework</Summary>
            </Book>
            <Book ISBN="0-7356-1288-9" Stock="out" Number="7">
              <Title>Inside C#</Title>
              <Summary>C# Language Programming</Summary>
            </Book>
            <Book ISBN="0-7356-1377-X" Stock="in" Number="5">
              <Title>Introducing Microsoft .NET</Title>
              <Summary>Overview of .NET Technology</Summary>
            </Book>
            <Book ISBN="0-7356-1448-2" Stock="out" Number="4">
              <Title>Microsoft C# Language Specifications</Title>
              <Summary>The C# language definition</Summary>
            </Book>
          </Books>
          <CDs>
            <CD Stock="in" Number="3">
              <Title>Classical Collection</Title>
              <Summary>Classical Music</Summary>
            </CD>
            <CD Stock="out" Number="9">
              <Title>Jazz Collection</Title>
              <Summary>Jazz Music</Summary>
            </CD>
          </CDs>
        </Inventory>
      </x:XData>
    </XmlDataProvider>
  </StackPanel.Resources>

  <TextBlock FontSize="18" FontWeight="Bold" Margin="10"
    HorizontalAlignment="Center">XML Data Source Sample</TextBlock>
  <ListBox
    Width="400" Height="300" Background="Honeydew">
    <ListBox.ItemsSource>
      <Binding Source="{StaticResource InventoryData}"
               XPath="*[@Stock='out'] | *[@Number>=8 or @Number=3]"/>
    </ListBox.ItemsSource>

    <!--Alternatively, you can do the following. -->
    <!--<ListBox Width="400" Height="300" Background="Honeydew"
      ItemsSource="{Binding Source={StaticResource InventoryData},
      XPath=*[@Stock\=\'out\'] | *[@Number>\=8 or @Number\=3]}">-->

    <ListBox.ItemTemplate>
      <DataTemplate>
        <TextBlock FontSize="12" Foreground="Red">
          <TextBlock.Text>
            <Binding XPath="Title"/>
          </TextBlock.Text>
        </TextBlock>
      </DataTemplate>
    </ListBox.ItemTemplate>
  </ListBox>
</StackPanel>

Bu örnekte gösterildiği gibi, öznitelik söz diziminde aynı bağlama bildirimini oluşturmak için özel karakterlerden düzgün bir şekilde kaçmalısınız. Daha fazla bilgi için bkz. XML Karakter Varlıkları ve XAML.

Bu örnek çalıştırıldığında, ListBox aşağıdaki öğeler olarak gösterilecektir. Bunlar, Kitaplar altındaki tüm öğelerin Başlık'si, Stok değeri "out" olan veya Sayı değeri 3 veya daha büyük ya da 8'e eşit olanlardır. 'te ayarlanan XPath değeri, yalnızca XmlDataProvider öğelerinin kullanıma açık olması gerektiğini gösterdiğinden, CD öğelerinin hiçbiri döndürülmez (bu, temelde bir filtre ayarlamadır).

Dört kitabın başlığını gösteren XPath örneğinin ekran görüntüsü.

Bu örnekte, XPathTextBlock bağlamasının DataTemplate "Başlık" olarak ayarlandığından, kitap başlıkları görüntülenir. ISBNgibi bir özniteliğin değerini görüntülemek istiyorsanız, bu XPath değerini "@ISBN" olarak ayarlayabilirsiniz.

WPF'deki XPath özellikleri XmlNode.SelectNodes yöntemiyle işlenir. Farklı sonuçlar elde etmek için XPath sorgularını değiştirebilirsiniz. Önceki örnekten bağlı XPath üzerindeki ListBox sorgusu için bazı örnekler:

  • XPath="Book[1]" ilk kitap öğesini ("XML in Action") döndürür. XPath dizinlerinin 0'a değil 1'e dayandığını unutmayın.

  • XPath="Book[@*]" tüm özniteliklere sahip tüm kitap öğelerini döndürür.

  • XPath="Book[last()-1]" sondan bir önceki kitap öğesini ("Introducing Microsoft .NET") döndürür.

  • XPath="*[position()>3]" ilk 3 hariç tüm kitap öğelerini döndürür.

bir XPath sorgusu çalıştırdığınızda, bir XmlNode veya XmlNodes listesi döndürür. XmlNode ortak dil çalışma zamanı (CLR) nesnesidir. Bu, ortak dil çalışma zamanı (CLR) özelliklerine bağlanmak için Path özelliğini kullanabileceğiniz anlamına gelir. Önceki örneği yeniden düşünün. Örneğin geri kalanı aynı kalırsa ve TextBlock bağlamasını aşağıdakiyle değiştirirseniz, döndürülen XmlNodes adlarını ListBoxiçinde görürsünüz. Bu durumda, döndürülen tüm düğümlerin adı "Book" şeklindedir.

<TextBlock FontSize="12" Foreground="Red">
  <TextBlock.Text>
    <Binding Path="Name"/>
  </TextBlock.Text>
</TextBlock>

Bazı uygulamalarda, verilerin tam içeriğinin derleme zamanında bilinmesi gerektiğinden, XML'nin XAML sayfasının kaynağı içinde bir veri adası olarak katıştırılması zor olabilir. Bu nedenle, aşağıdaki örnekte olduğu gibi verileri bir dış XML dosyasından almak da desteklenir:

<XmlDataProvider x:Key="BookData" Source="data\bookdata.xml" XPath="Books"/>

XML verileri bir uzak XML dosyasında yer alırsa, Source özniteliğine aşağıdaki gibi uygun bir URL atayarak verilere erişimi tanımlayabilirsiniz:

<XmlDataProvider x:Key="BookData" Source="http://MyUrl" XPath="Books"/>

Ayrıca bakınız