Postupy: Připojení k datům XML použitím objektu XMLDataProvider a dotazů XPath

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

XmlDataProviderPodkladová data, ke kterým je možné přistupovat prostřednictvím datové vazby ve vaší aplikaci, mohou být libovolným stromem uzlů XML. Jinými slovy, představuje XmlDataProvider 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 rámci oddíluResources. Datový ostrůvek XML musí být zabalený do <x:XData> značek a vždy musí mít jeden kořenový uzel, což je Inventář v tomto příkladu.

Poznámka:

Kořenový uzel dat XML má atribut XMLns , 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 datový ostrůvek dědí System.Windows obor názvů. Z tohoto důvodu je potřeba nastavit prázdný obor názvů, aby se dotazy XPath nezvalifikovaly oborem System.Windows názvů, 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ě uvodit speciální znaky. Další informace naleznete v tématu XML Character Entities and XAML.

Při ListBox spuštění tohoto příkladu se zobrazí následující položky. Jedná se o názevvšech prvků v části Knihy s hodnotou Akcie "out" nebo číslo hodnoty 3 nebo větší než nebo rovno 8. Všimněte si, že nejsou vráceny žádné položky CD , protože XPath hodnota nastavená na XmlDataProvider značce, že by měly být vystaveny pouze prvky Knihy (v podstatě nastavení filtru).

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

V tomto příkladu se zobrazí názvy knih, protože vazba v sadě je nastavená na Název.DataTemplateTextBlockXPath Pokud chcete zobrazit hodnotu atributu, například ISBN, nastavíte tuto XPath hodnotu na "@ISBN".

Vlastnosti XPath v WPF jsou zpracovávány XmlNode.SelectNodes metoda. Dotazy XPath můžete upravit tak, aby získaly různé výsledky. Tady je několik příkladů dotazu XPath vázaného 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 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 seznam uzlů XmlNodes nebo seznam. XmlNode je objekt CLR (Common Language Runtime), což znamená, že vlastnost můžete použít Path k vytvoření vazby s vlastnostmi modulu CLR (Common Language Runtime). Podívejte se znovu na předchozí příklad. Pokud zbytek příkladu zůstane stejný a změníte TextBlock vazbu na následující, uvidíte názvy vrácených uzlů XmlNodes v ListBoxsouboru . 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, definujte přístup k datům tak, že k atributu Source přiřadíte odpovídající adresu URL následujícím způsobem:

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

Viz také