Gewusst wie: Binden an XML-Daten mithilfe von XMLDataProvider und XPath-Abfragen

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.

HinweisHinweis

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-Element festgelegte XPath-Wert angibt, dass nur die Books-Elemente zur Verfügung gestellt werden sollen (durch die Einrichtung eines Filters).

XPath-Beispiel

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 ein XmlNode-Element oder eine Liste von XmlNodes zurück. Ein XmlNode-Element 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>

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"/>

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

Referenz

ObjectDataProvider

Konzepte

Übersicht über Bindungsquellen

Übersicht über Datenbindung

Weitere Ressourcen

Gewusst-wie-Themen zur Datenbindung