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

Bu örnek, kullanarak XML verilerine nasıl bağlanacağını XmlDataProvider gösterir.

ile, uygulamanıza veri bağlama aracılığıyla erişilebilen temel alınan XmlDataProvider 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 bir XML veri adası olarak eklenmiştir. XML veri adası etiketlere sarmalanmış olmalı ve her zaman tek bir kök düğüme sahip olmalı ve bu örnekte <x:XData><x:XData> değerine sahip olması gerekir.

Not

XML verisi kök düğümü, XML ad alanını boş bir dizeye ayaran bir xmlns özniteliğine sahip. 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 bu nedenle veri adası ad alanını System.Windows devralınır. Bu nedenle, XPath sorgularının ad alanı tarafından uygun durumdan uzak tutmak için ad alanını boş olarak ayarlamanız gerekir ve bu da sorguları System.Windows yanlış yönlendirecek.

<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 dizimsinde aynı bağlama bildirimini oluşturmak için özel karakterlerden düzgün şekilde kaçış karakteri atlamalıdır. Daha fazla bilgi için bkz. XML Karakter Varlıkları ve XAML.

ListBoxBu örnek çalıştır olduğunda aşağıdaki öğeleri gösterir. Bunlar, Booksaltındaki tüm öğelerin Başlıklarında Stock değeri "out" veya Number değeri 3 veya daha büyük ya da 8'e eşittir. üzerinde ayarlanmış olan değer yalnızca Books öğelerinin açığa çıkar (temelde bir filtre ayarlama) gerektiğini gösterir olduğundan hiçbir CDXmlDataProvider öğelerinin döndürülene dikkat edilecektir. XmlDataProvider

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

Bu örnekte, içinde bağlamanın " Başlık " olarak ayarlanmış olduğundan XPathTextBlock kitap başlıkları DataTemplateXPath ISBNgibi bir özniteliğin değerini görüntülemek için bu değeri " olarak @ISBN ayarlayın.

WPF'de XPath özellikleri XmlNode.SelectNodes yöntemi tarafından ele kullanılır. Farklı sonuçlar elde etmek için XPath sorgularını değiştirebilirsiniz. Önceki örnekteki XPath sınırda sorgu için bazı ListBox örnekler aşağıda verilmiştir:

  • XPath="Book[1]" , ilk kitap öğesini ("Eylemde XML") iade eder. XPath dizinleri 0'ı değil 1'i temel alan bir dizindir.

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

  • XPath="Book[last()-1]" , son kitap öğesine ikinci öğeyi ("Microsoft .NET") geri döner.

  • XPath="*[position()>3]" ilk 3 dışında tüm kitap öğelerini geri dönecektir.

Bir XPath sorgusu çalıştırarak XmlNodes listesini veya bir listesini döndürür. XmlNode ortak dil çalışma zamanı (CLR) nesnesidir, yani ortak dil çalışma zamanı (CLR) özelliklerine bağlamak için Path özelliğini kullanabilirsiniz. Önceki örneği yeniden düşünün. Örneğin geri kalanı aynı kalırsa ve bağlamayı aşağıdakiyle değiştirirsiniz, döndürülen XmlNode adlarını içinde TextBlockListBox göreceğiz. Bu durumda, döndürülen tüm düğümlerin adı " Kitap "şeklindedir.

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

Bazı uygulamalarda XML dosyasının XAML sayfasının kaynağında bir veri adası olarak katıştırmak, verilerin tam içeriğinin derleme zamanında bilinmelerini şarttır. Bu nedenle, aşağıdaki örnekte olduğu gibi bir dış XML dosyasından veri almak da de desteklenegeldi:

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

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

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

Ayrıca bkz.