Guide pratique pour lier des données XML à l’aide d’une requête XMLDataProvider et XPath
Cet exemple montre comment lier 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 être 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 comme source de liaison.
Exemple
Dans l’exemple suivant, les données sont incorporées directement en tant qu'île de données XML dans la section Resources. Un îlot de données XML doit être encapsulé dans <x:XData>
balises et avoir toujours un nœud racine unique, qui est Inventory dans cet exemple.
Remarque
Le nœud racine des données XML est un attribut xmlns qui définit l’espace de noms XML sur une chaîne vide. Il s’agit d’une exigence pour l’application de requêtes XPath à un îlot de données inclus dans la page XAML. Dans ce cas inline, le XAML, et donc l’îlot de données, hérite de l’espace de noms System.Windows. En raison de cela, vous devez définir l’espace de noms vide pour empêcher les requêtes XPath d’être qualifiées par l’espace de noms System.Windows, ce qui aurait mal dirigé les 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 etXAML .
La ListBox affiche les éléments suivants lors de l’exécution de cet exemple. 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. Notez qu’aucun élément CD n'est retourné, car la valeur XPath définie sur XmlDataProvider indique que seuls les éléments Livres doivent être exposés (en définissant essentiellement un filtre).
Dans cet exemple, les titres du livre sont affichés, car le XPath de la liaison TextBlock dans le DataTemplate est définie sur « Titre ». Si vous souhaitez afficher la valeur d’un attribut, tel que le ISBN, vous devez définir cette valeur XPath 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 requête XPath 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 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 une XmlNode ou une liste de XmlNodes. XmlNode est un objet CLR (Common Language Runtime), ce qui signifie que vous pouvez utiliser la propriété Path pour établir une liaison aux propriétés CLR (Common Language Runtime). Considérez à nouveau l’exemple précédent. Si le reste de l’exemple reste le même et que vous modifiez la liaison TextBlock comme suit, vous verrez les noms des XmlNodes retournés 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 code XML en tant qu’île de données dans la source de la page XAML 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’attribut Source comme suit :
<XmlDataProvider x:Key="BookData" Source="http://MyUrl" XPath="Books"/>
Voir aussi
.NET Desktop feedback