Comment : effectuer une liaison à des données XML à l'aide d'un XMLDataProvider et de requêtes XPath

Cet exemple montre comment effectuer une liaison à des données XML à l’aide d’un XmlDataProvider .

Avec un XmlDataProvider , les données sous-jacentes accessibles via la liaison de données dans votre application peuvent correspondre à n’importe quelle arborescence de nœuds XML. En d’autres termes, un XmlDataProvider offre un moyen pratique d’utiliser n’importe quelle arborescence de nœuds XML en tant que source de liaison.

Exemple

Dans l’exemple suivant, les données sont incorporées directement sous la forme d’un îlot de données XML dans la Resources section. Un îlot de données XML doit être encapsulé dans des <x:XData> balises et toujours avoir un nœud racine unique, qui est un inventaire dans cet exemple.

Notes

Le nœud racine des données XML a un attribut xmlns qui définit l’espace de noms XML sur une chaîne vide. Il s’agit d’une condition requise pour appliquer des requêtes XPath à un îlot de données inline dans la page XAML. Dans ce cas Inline, XAML , et par conséquent l’îlot de données, hérite de l' System.Windows espace de noms. Pour cette raison, vous devez définir l’espace de noms comme vide pour empêcher les requêtes XPath d’être qualifiées par l' System.Windows espace de noms, ce qui entraînerait une inversion des requêtes.

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

Comme indiqué dans cet exemple, pour créer la même déclaration de liaison dans la syntaxe d’attribut, vous devez échapper les caractères spéciaux correctement. Pour plus d’informations, consultez Entités de caractères XML et XAML.

Le ListBox affiche les éléments suivants lorsque cet exemple est exécuté. Il s’agit de tous les objets Title s de tous les éléments sous Books ayant une valeur Stock de « out » ou une valeur Number de 3 ou supérieure ou égale à 8. Notez qu’aucun élément CD n’est retourné, car la XPath valeur définie sur le XmlDataProvider indique que seuls les éléments books doivent être exposés (en définissant essentiellement un filtre).

Capture d’écran de l’exemple XPath montrant le titre de quatre livres.

Dans cet exemple, les titres des livres s’affichent car le XPath de la TextBlock liaison dans la DataTemplate est défini sur «title». Si vous souhaitez afficher la valeur d’un attribut, telle que le numéro ISBN, vous devez définir cette XPath valeur sur « @ISBN ».

Les propriétés XPath dans WPF sont gérées par la méthode XmlNode.SelectNodes. Vous pouvez modifier les requêtes XPath pour obtenir des résultats différents. Voici quelques exemples pour la XPath requête sur la limite ListBox de l’exemple précédent :

  • XPath="Book[1]" retourne le premier élément d’ouvrage (« XML in Action »). Notez que les index XPath sont basés sur 1, et non sur 0.

  • XPath="Book[@*]" retourne tous les éléments d’ouvrage avec des attributs.

  • XPath="Book[last()-1]" retourne l’avant dernier élément d’ouvrage (« Introducing Microsoft .NET »).

  • XPath="*[position()>3]" retournera tous les éléments d’ouvrage, à l’exception des 3 premiers.

Lorsque vous exécutez une requête XPath , elle retourne un XmlNode ou une liste de XMLNodes. XmlNode est un objet common language runtime (CLR), ce qui signifie que vous pouvez utiliser la Path propriété pour établir une liaison avec les propriétés de Common Language Runtime (CLR). Regardez de nouveau l’exemple précédent. Si le reste de l’exemple reste le même et que vous remplacez la TextBlock liaison par ce qui suit, vous verrez les noms du XMLNodes retourné dans le ListBox . Dans ce cas, le nom de tous les nœuds retournés est « Book ».

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

Dans certaines applications, l’incorporation du XML en tant qu’îlot de données dans la source de la XAML page peut être gênante car le contenu exact des données doit être connu au moment de la compilation. Par conséquent, l’obtention des données à partir d’un fichier XML externe est également prise en charge, comme dans l’exemple suivant :

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

Si les données XML résident dans un fichier XML distant, vous devez définir l’accès aux données en affectant une URL appropriée à l' Source attribut comme suit :

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

Voir aussi