Partager via


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

Mise à jour : novembre 2007

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 noeuds XML. Autrement dit, un XmlDataProvider offre un moyen commode d'utiliser n'importe quelle arborescence de noeuds XML en tant que source de liaison.

Exemple

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

Remarque :

Le nœud racine des données XML a un attribut xmlns qui définit l'espace de noms XML à l'aide d'une chaîne vide. Il s'agit d'une spécification pour l'application des requêtes XPath à un îlot de données qui est inline dans la page XAML. Dans ce cas inline, le XAML (et par conséquent, l'îlot de données) hérite de l'espace de noms System.Windows. Vous devez donc définir un espace de noms vide pour que les requêtes XPath ne soient pas qualifiées par l'espace de noms System.Windows, ce qui risque de mal orienter les requêtes.

<StackPanel
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  Background="Cornsilk">

  <StackPanel.Resources>
    <XmlDataProvider x:Key="InventoryData" XPath="Inventory/Books">
      <x:XData>
        <Inventory >
          <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 le montre cet exemple, pour créer la même déclaration de liaison dans la syntaxe d'attributs, vous devez effectuer une séquence correcte d'échappement de caractères spéciaux. Pour plus d'informations, consultez Entités de caractères XML et XAML.

La ListBox affichera les éléments suivants lors de l'exécution de cet exemple. Il s'agit des Titres de tous les éléments situés sous Livres avec une valeur de Stock égale à « out » ou d'une valeur Nombre égale à 3 ou supérieure ou égale à 8. Il est à noter qu'aucun élément CD n'est retourné car la valeur XPath affectée à XmlDataProvider indique que seuls les éléments Livres doivent être exposés (essentiellement pour définir un filtre).

Exemple XPath

Dans cet exemple, les titres des ouvrages sont affichés car le XPath de la liaison TextBlock dans DataTemplate a la valeur « Titre ». Si vous voulez afficher la valeur d'un attribut, tel que ISBN, vous devez attribuer au XPath la valeur « @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 de la requête XPath sur l'élément lié ListBox provenant de l'exemple précédent :

  • XPath="Book[1]" retournera le premier élément du livre (« XML en action »). Notez que les index XPath sont basés sur 1, et non pas sur 0.

  • XPath="Book[@*]" retournera tous les éléments de livre avec tout attribut.

  • XPath="Book[last()-1]" retournera l'avant dernier élément du livre (« Présentation de Microsoft .NET »).

  • XPath="*[position()>3]" retournera tous les éléments du livre, sauf les trois premiers.

Quand vous exécutez une requête XPath, celle-ci retourne XmlNode ou une liste de XmlNodes. XmlNode est un objet Common Language Runtime (CLR), ce qui signifie que vous pouvez utiliser la propriété Path pour effectuer une liaison aux propriétés Common Language Runtime (CLR). Reprenons l'exemple précédent. Si le reste de l'exemple reste inchangé et que vous remplacez la liaison TextBlock par ce qui est indiqué, vous verrez les noms des XmlNodes retournés dans la ListBox. Dans ce cas, le nom de tous les nœuds retournés est « Livre ».

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

Pour obtenir l'exemple de code complet, consultez Liaison à des données XML, exemple.

Pour certaines applications, l'incorporation du code XML en tant qu'îlot de données dans la page XAML source peut être gênante parce que 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"/>

Pour obtenir l'exemple de code complet, consultez XMLDataProvider avec fichier de données incorporé, exemple.

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

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

Voir aussi

Tâches

Comment : effectuer une liaison avec XDocument, XElement ou LINQ pour des résultats de requête XML

Comment : utiliser le modèle maître/détail avec des données XML hiérarchiques

Concepts

Vue d'ensemble des sources de liaison

Vue d'ensemble de la liaison de données

Référence

ObjectDataProvider

Autres ressources

Exemples de liaisons de données

Rubriques Comment relatives aux liaisons de données