Comment : effectuer une liaison à des données XML à l'aide d'un XMLDataProvider et de requêtes XPathHow to: Bind to XML Data Using an XMLDataProvider and XPath Queries

Cet exemple montre comment effectuer une liaison à des données XML à l’aide d’un XmlDataProvider.This example shows how to bind to XML data using an 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.With an XmlDataProvider, the underlying data that can be accessed through data binding in your application can be any tree of XML nodes. En d’autres termes, une XmlDataProvider offre un moyen pratique d’utiliser n’importe quelle arborescence de nœuds XML en tant que source de liaison.In other words, an XmlDataProvider provides a convenient way to use any tree of XML nodes as a binding source.

ExempleExample

Dans l’exemple suivant, les données sont incorporées directement sous la forme d’un îlot de données XML dans la section Resources.In the following example, the data is embedded directly as an XML data island within the Resources section. Un îlot de données XML doit être encapsulé dans des balises <x:XData> et avoir toujours un seul nœud racine, qui est un inventaire dans cet exemple.An XML data island must be wrapped in <x:XData> tags and always have a single root node, which is Inventory in this example.

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.The root node of the XML data has an xmlns attribute that sets the XML namespace to an empty string. Il s’agit d’une condition requise pour appliquer des requêtes XPath à un îlot de données inline dans la page XAMLXAML.This is a requirement for applying XPath queries to a data island that is inline within the XAMLXAML page. Dans ce cas Inline, l' XAMLXAML, et donc l’îlot de données, hérite de l’espace de noms System.Windows.In this inline case, the XAMLXAML, and thus the data island, inherits the System.Windows namespace. 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’espace de noms System.Windows, ce qui entraînerait une inversion des requêtes.Because of this, you need to set the namespace blank to keep XPath queries from being qualified by the System.Windows namespace, which would misdirect the queries.

<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.As shown in this example, to create the same binding declaration in attribute syntax you must escape the special characters properly. Pour plus d’informations, consultez Entités de caractères XML et XAML.For more information, see XML Character Entities and XAML.

Le ListBox affiche les éléments suivants lorsque cet exemple est exécuté.The ListBox will show the following items when this example is run. Il s’agit de tous les objets Titles 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.These are the Titles of all of the elements under Books with either a Stock value of "out" or a Number value of 3 or greater than or equals to 8. Notez qu’aucun élément CD n’est retourné, car la valeur XPath définie sur la XmlDataProvider indique que seuls les éléments books doivent être exposés (en définissant un filtre de façon générale).Notice that no CD items are returned because the XPath value set on the XmlDataProvider indicates that only the Books elements should be exposed (essentially setting a filter).

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

Dans cet exemple, les titres des livres s’affichent parce que la XPath de la liaison TextBlock dans le DataTemplate est définie sur «title».In this example, the book titles are displayed because the XPath of the TextBlock binding in the DataTemplate is set to "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».If you want to display the value of an attribute, such as the ISBN, you would set that XPath value to "@ISBN".

Les propriétés XPath dans WPFWPF sont gérées par la méthode XmlNode.SelectNodes.The XPath properties in WPFWPF are handled by the XmlNode.SelectNodes method. Vous pouvez modifier les requêtes XPath pour obtenir des résultats différents.You can modify the XPath queries to get different results. Voici quelques exemples pour la requête XPath sur les ListBox liés de l’exemple précédent :Here are some examples for the XPath query on the bound ListBox from the previous example:

  • XPath="Book[1]" retourne le premier élément d’ouvrage (« XML in Action »).XPath="Book[1]" will return the first book element ("XML in Action"). Notez que les index XPath sont basés sur 1, et non sur 0.Note that XPath indexes are based on 1, not 0.

  • XPath="Book[@*]" retourne tous les éléments d’ouvrage avec des attributs.XPath="Book[@*]" will return all book elements with any attributes.

  • XPath="Book[last()-1]" retourne l’avant dernier élément d’ouvrage (« Introducing Microsoft .NET »).XPath="Book[last()-1]" will return the second to last book element ("Introducing Microsoft .NET").

  • XPath="*[position()>3]" retournera tous les éléments d’ouvrage, à l’exception des 3 premiers.XPath="*[position()>3]" will return all of the book elements except for the first 3.

Lorsque vous exécutez une requête XPath , elle retourne un XmlNode ou une liste de XMLNodes.When you run an XPath query, it returns an XmlNode or a list of XmlNodes. XmlNode est un objet common language runtime (CLR), ce qui signifie que vous pouvez utiliser la propriété Path pour établir une liaison avec les propriétés common language runtime (CLR).XmlNode is a common language runtime (CLR) object, which means you can use the Path property to bind to the common language runtime (CLR) properties. Regardez de nouveau l’exemple précédent.Consider the previous example again. Si le reste de l’exemple reste le même et que vous modifiez la liaison de TextBlock à ce qui suit, vous verrez les noms du XmlNodes retourné dans le ListBox.If the rest of the example stays the same and you change the TextBlock binding to the following, you will see the names of the returned XmlNodes in the ListBox. Dans ce cas, le nom de tous les nœuds retournés est « Book ».In this case, the name of all the returned nodes is "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 XAMLXAML page peut être gênante, car le contenu exact des données doit être connu au moment de la compilation.In some applications, embedding the XML as a data island within the source of the XAMLXAML page can be inconvenient because the exact content of the data must be known at compile time. Par conséquent, l’obtention des données à partir d’un fichier XML externe est également prise en charge, comme dans l’exemple suivant :Therefore, obtaining the data from an external XML file is also supported, as in the following example:

<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’attribut Source comme suit :If the XML data resides in a remote XML file, you would define access to the data by assigning an appropriate URL to the Source attribute as follows:

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

Voir aussiSee also