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

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

ile XmlDataProvider, 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, bağlama XmlDataProvider kaynağı olarak herhangi bir XML düğüm ağacını kullanmak için uygun bir yol sağlar.

Örnek

Aşağıdaki örnekte, veriler doğrudan bölümün içinde Resources bir XML veri adası olarak katıştırılır. Xml veri adası etiketlerde <x:XData> sarmalanmalıdır ve her zaman bu örnekte Inventory olan tek bir kök düğüme sahip olmalıdır.

Dekont

XML verilerinin kök düğümü, XML ad alanını boş bir dizeye ayarlayan bir xmlns özniteliğine sahiptir. 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ı ad alanını System.Windows devralır. Bu nedenle, XPath sorgularının ad alanı tarafından System.Windows 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.

, ListBox bu örnek çalıştırıldığında aşağıdaki öğeleri gösterir. Bunlar, Kitaplar'ınaltındaki hisse senedi değeri "out" veya Sayı değeri 3 veya 8'den büyük veya 8'e eşit olan tüm öğelerin Başlık'larıdır. üzerinde XmlDataProvider ayarlanan değer yalnızca Kitaplar öğelerinin XPath kullanıma açık olması gerektiğini gösterdiğinden (temelde bir filtre ayarlayarak) HIÇBIR CD öğesinin döndürülmediğinden emin olun.

Screenshot of the XPath example showing the title of four books.

Bu örnekte, içindeki bağlama "Başlık" olarak ayarlandığından TextBlockkitap başlıkları görüntülenirXPath.DataTemplate ISBN gibi bir özniteliğin değerini görüntülemek istiyorsanız, bu XPath değeri "@ISBN" olarak ayarlayabilirsiniz.

WPF'deki XPath özellikleri XmlNode.SelectNodes yöntemi tarafından işlenir. Farklı sonuçlar almak için XPath sorgularını değiştirebilirsiniz. Önceki örnekteki XPath ilişkili ListBox sorgu için bazı örnekler aşağıda verilmiştir:

  • 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]" , ikinciyi son kitap öğesine ("Microsoft .NET Tanıtımı") 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 veya xmlnodes listesi döndürür XmlNode . XmlNode ortak dil çalışma zamanı (CLR) nesnesidir. Bu, ortak dil çalışma zamanı (CLR) özelliklerine bağlanmak için özelliğini kullanabileceğiniz Path anlamına gelir. Önceki örneği yeniden düşünün. Örneğin geri kalanı aynı kalırsa ve bağlamayı TextBlock aşağıdakiyle değiştirirseniz, içinde döndürülen XmlNodes ListBoxadlarını görürsünüz. Bu durumda, döndürülen tüm düğümlerin adı "Book" olur.

<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 bulunuyorsa, özniteliğine aşağıdaki gibi uygun bir URL Source atayarak verilere erişimi tanımlayabilirsiniz:

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

Ayrıca bkz.