Gewusst wie: Binden an XML-Daten mithilfe von XMLDataProvider und XPath-Abfragen
Aktualisiert: November 2007
Dieses Beispiel zeigt, wie Daten mit einem XmlDataProvider an XML gebunden werden.
Mit einem XmlDataProvider können Sie mithilfe der Datenbindung auf die Ihrer Anwendung zugrunde liegenden XML-Knotenstrukturen zugreifen. Mit anderen Worten: Ein XmlDataProvider bietet eine komfortable Möglichkeit, jede beliebige Struktur von XML-Knoten als Bindungsquelle zu verwenden.
Beispiel
Im folgenden Beispiel werden die Daten direkt als XML-Dateninsel im Abschnitt Resources eingebettet. Eine XML-Dateninsel muss mit <x:XData>-Tags umschlossen sein und immer über einen einzelnen Stammknoten, in diesem Beispiel Inventory, verfügen.
Tipp
Der Stammknoten der XML-Daten verfügt über ein xmlns-Attribut, das den XML-Namespace auf eine leere Zeichenfolge festlegt. Dies ist eine Anforderung für die Anwendung von XPath-Abfragen auf eine Dateninsel, die sich inline innerhalb der XAML-Seite befindet. In diesem Inlinefall erbt XAML, und damit die Dateninsel, den System.Windows-Namespace. Aus diesem Grund müssen Sie den Namespace auf eine leere Zeichenfolge festlegen und verhindern so, dass XPath-Abfragen vom System.Windows-Namespace bestimmt werden, was zu fehlgeleiteten Abfragen führen würde.
<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>
Wie in diesem Beispiel veranschaulicht, müssen Sie zur Erstellung derselben Bindungsdeklaration in Attributsyntax die Sonderzeichen ordnungsgemäß mit einem Escapezeichen versehen. Weitere Informationen hierzu finden Sie unter XML-Zeichenentitäten und XAML.
Wenn dieses Beispiel ausgeführt wird, zeigt das ListBox die folgenden Elemente an. Das sind die Title-Angaben aller Elemente unter Books, deren Stock-Wert entweder "out" (vergriffen) lautet oder einen Number-Wert von 3 bzw. größer/gleich 8 aufweist. Beachten Sie, dass keine CD-Elemente zurückgegeben werden, da der im XmlDataProvider festgelegte XPath-Wert angibt, dass nur die Book-Elemente zur Verfügung gestellt werden sollen (durch die Einrichtung eines Filters).
In diesem Beispiel werden die Buchtitel angezeigt, weil der XPath der TextBlock-Bindung in der DataTemplate auf "Title" festgelegt ist. Um den Wert eines Attributs anzuzeigen, z. B. ISBN, legen Sie den XPath-Wert auf "@ISBN" fest.
Die XPath-Eigenschaften in WPF werden von der XmlNode.SelectNodes-Methode behandelt. Sie können die XPath-Abfragen ändern, um andere Ergebnisse abzurufen. Es folgen einige Beispiele der XPath-Abfrage für das gebundene ListBox des vorherigen Beispiels:
XPath="Book[1]" gibt das erste Buchelement ("XML in Action") zurück. Beachten Sie, dass XPath-Indizes auf 1, nicht auf 0, basieren.
XPath="Book[@*]" gibt alle Buchelemente mit beliebigen Attributen zurück.
XPath="Book[last()-1]" gibt das vorletzte Buchelement ("Introducing Microsoft .NET") zurück.
XPath="*[position()>3]" gibt außer den ersten 3 Buchelementen alle Buchelemente zurück.
Wenn Sie eine XPath-Abfrage ausführen, gibt sie einen XmlNode oder eine Liste von XmlNodes zurück. Ein XmlNode ist ein common language runtime (CLR)-Objekt. Das bedeutet, dass Sie die Path-Eigenschaft zur Bindung an die common language runtime (CLR)-Eigenschaften verwenden können. Betrachten Sie erneut das vorherige Beispiel. Wenn Sie den Rest des Beispiels unverändert lassen und nur die TextBlock-Bindung wie folgt ändern, werden im ListBox die Namen der zurückgegebenen XmlNodes angezeigt. In diesem Fall lautet der Name aller zurückgegebenen Knoten "Book".
<TextBlock FontSize="12" Foreground="Red">
<TextBlock.Text>
<Binding Path="Name"/>
</TextBlock.Text>
</TextBlock>
Das vollständige Codebeispiel finden Sie unter Beispiel für die Bindung an XML-Daten.
In bestimmten Anwendungen ist das Einbetten von XML als Dateninsel in die Quelle der XAML-Seite nicht geeignet, da zur Kompilierzeit der genaue Inhalt der Daten bekannt sein muss. Aus diesem Grund wird das Abrufen von Daten aus einer externen XML-Datei ebenso unterstützt. Das folgende Beispiel veranschaulicht dies.
<XmlDataProvider x:Key="BookData" Source="data\bookdata.xml" XPath="Books"/>
Das vollständige Codebeispiel finden Sie unter XMLDataProvider-Beispiel mit eingebetteter Datendatei.
Wenn die XML-Daten in einer XML-Remotedatei gespeichert sind, definieren Sie den Zugriff auf die Daten durch das Zuweisen einer geeigneten URL zum Source-Attribut. Das folgende Beispiel veranschaulicht dies:
<XmlDataProvider x:Key="BookData" Source="http://MyUrl" XPath="Books"/>
Siehe auch
Aufgaben
Gewusst wie: Binden an XDocument, XElement oder LINQ für XML-Abfrageergebnisse
Gewusst wie: Verwenden des Master/Detail-Musters mit hierarchischen XML-Daten
Konzepte
Übersicht über Bindungsquellen