Share via


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. Autrement dit, un XmlDataProvider offre un moyen commode 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 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.

RemarqueRemarque

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 (Titles) de tous les éléments sous Books ayant une valeur Stock « out » ou une valeur Number de 3 ou supérieure ou égale à 8. Notez qu'aucun élément CD élément n'est retourné parce que la valeur XPath définie sur le XmlDataProvider indique que seuls les éléments Books doivent être exposés (ce qui définit essentiellement 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.

Lorsque vous exécutez une requête XPath, il retourne un 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 créer une liaison avec les 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 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"/>

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

Référence

ObjectDataProvider

Concepts

Vue d'ensemble des sources de liaison

Vue d'ensemble de la liaison de données

Autres ressources

Rubriques "Comment" relatives aux liaisons de données