Sdílet prostřednictvím


Postupy: Vytvoření vazby k datům XML pomocí XMLDataProvideru a dotazů XPath

Tento příklad ukazuje, jak vytvořit vazbu na data XML pomocí XmlDataProvider.

S XmlDataProvidermohou být podkladová data, ke kterým je možné přistupovat prostřednictvím datové vazby ve vaší aplikaci, jakákoli stromová struktura uzlů XML. Jinými slovy, XmlDataProvider poskytuje pohodlný způsob použití libovolného stromu uzlů XML jako zdroje vazby.

Příklad

V následujícím příkladu jsou data vložena přímo jako datový ostrůvek XML v části Resources. Datový ostrůvek XML musí být zabalený do <x:XData> značek a vždy musí mít jeden kořenový uzel, který je Inventář v tomto příkladu.

Poznámka

Kořenový uzel dat XML má xmlns atribut, který nastaví obor názvů XML na prázdný řetězec. Toto je požadavek pro použití dotazů XPath na datový ostrůvek, který je vložený na stránce XAML. V tomto vloženém případě XAML a tedy i datový ostrůvek dědí System.Windows obor názvů. Z tohoto důvodu je potřeba nastavit obor názvů na prázdný, aby se dotazy XPath nekvalifikovaly oborem názvů System.Windows, což by chybně směrovalo dotazy.

<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>

Jak je znázorněno v tomto příkladu, chcete-li vytvořit stejnou deklaraci vazby v syntaxi atributu, musíte správně escapovat speciální znaky. Další informace naleznete v tématu znakové entity XML a XAML.

Při spuštění tohoto příkladu se v ListBox zobrazí následující položky. Jedná se o Názevvšech prvků v Knihy s hodnotou Stock "out" nebo Číslo 3 nebo větší nebo rovno 8. Všimněte si, že se nevrací žádné položky CD, protože hodnota nastavená na značí, že by se měly zobrazit jenom prvky Books (v podstatě nastavení filtru).

snímek obrazovky s příkladem XPath zobrazující název čtyř knih

V tomto příkladu jsou názvy knih zobrazeny, protože XPath vazby TextBlock v DataTemplate je nastavena na "Title". Pokud chcete zobrazit hodnotu atributu, například ISBN, nastavili byste tuto hodnotu XPath na "@ISBN".

Vlastnosti XPath ve WPF zpracovává metoda XmlNode.SelectNodes. Můžete upravit dotazy XPath tak, aby získaly různé výsledky. Zde jsou některé příklady dotazu XPath na hranici ListBox z předchozího příkladu:

  • XPath="Book[1]" vrátí první element knihy (XML v akci). Všimněte si, že indexy XPath jsou založené na 1, nikoli na 0.

  • XPath="Book[@*]" vrátí všechny prvky knihy s libovolnými atributy.

  • XPath="Book[last()-1]" vrátí druhý prvek poslední knihy ("Představujeme Microsoft .NET").

  • XPath="*[position()>3]" vrátí všechny prvky knihy s výjimkou prvních 3.

Když spustíte dotaz XPath, vrátí XmlNode nebo seznam uzlů XmlNodes. XmlNode je objekt CLR (Common Language Runtime), což znamená, že můžete použít vlastnost Path k vytvoření vazby s vlastnostmi modulu CLR (Common Language Runtime). Podívejte se znovu na předchozí příklad. Pokud zůstane zbytek příkladu stejný a změníte vazbu TextBlock na následující, uvidíte názvy vrácených uzlů XML v části ListBox. V tomto případě je název všech vrácených uzlů "Book".

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

V některých aplikacích může být vložení XML jako datového ostrůvku do zdroje stránky XAML nevhodné, protože přesný obsah dat musí být znám v době kompilace. Proto je také podporováno získání dat z externího souboru XML, jak je znázorněno v následujícím příkladu:

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

Pokud se data XML nacházejí ve vzdáleném souboru XML, definujete přístup k datům tak, že přiřadíte odpovídající adresu URL k atributu Source následujícím způsobem:

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

Viz také