Freigeben über


Binden an XML-Daten mithilfe von XMLDataProvider- und XPath-Abfragen

In diesem Beispiel wird die Bindung an XML-Daten veranschaulicht, indem einem XmlDataProvider verwendet wird.

Mit einem XmlDataProvider können die untergeordneten Daten, die durch die Datenbindung in Ihrer App abgerufen werden können, irgendeine XML-Knotenstruktur sein. Mit anderen Worten, ein XmlDataProvider bietet eine bequeme Möglichkeit, einen beliebigen Baum von XML-Knoten als Bindungsquelle zu verwenden.

Beispiel

Im folgenden Beispiel werden die Daten direkt als XML-Dateninsel in den Resources-Abschnitt eingebettet. Eine XML-Dateninsel muss in <x:XData> Tags eingeschlossen werden und immer einen einzelnen Stammknoten aufweisen, der in diesem Beispiel Inventory ist.

Anmerkung

Der Stammknoten der XML-Daten weist ein xmlns Attribut auf, 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 die XAML und damit die Dateninsel den System.Windows-Namespace. Aus diesem Gründen müssen Sie den Namespace leer festlegen, damit XPath-Abfragen nicht vom System.Windows-Namespace qualifiziert werden, was die Abfragen falsch leitet.

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

Wie in diesem Beispiel veranschaulicht, müssen Sie zum Erstellen derselben Bindungsdeklaration in der Attributsyntax die Sonderzeichen ordnungsgemäß mit einem Escapezeichen versehen. Weitere Informationen hierzu finden Sie unter XML-Zeichenentitäten und XAML.

Der ListBox zeigt das folgende Element, wenn dieses Beispiel Ausführen ist. Das sind die Title-Angaben aller Elemente unter Books, deren Stock-Wert entweder out lautet oder einen Number-Wert von 3 bzw. größer gleich 8 aufweist. Beachten Sie, dass keine CD-Elemente zurückgegeben werden, da der auf XmlDataProvider eingestellte XPath-Wert anzeigt, dass nur die Books-Elemente freigegeben werden sollten (im Wesentlichen das Festlegen eines Filters).

Screenshot: XPath-Beispiel mit den Titeln von vier Büchern

In diesem Beispiel werden die Buchtitel angezeigt, weil die XPath-Eigenschaft der TextBlock-Bindung im DataTemplate-Element auf "Title" festgelegt ist. Wenn Sie den Wert eines Attributs anzeigen möchten, z. B. die ISBN-, legen Sie diesen 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 unterschiedliche Ergebnisse zu erhalten. Hier sind einige Beispiele für die XPath-Abfrage in der Abgrenzung ListBox vom vorherigen Beispiel:

  • XPath="Book[1]" gibt das erste Buchelement („XML in Action“) zurück. Beachten Sie, dass XPath- Indizes auf 1 und 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 drei Buchelementen alle Buchelemente zurück.

Wenn Sie eine XPath-Abfrage ausführen, gibt sie eine XmlNode-Klasse oder eine XmlNodes-Liste zurück. XmlNode ist ein CLR-Objekt (Common Language Runtime), was bedeutet, dass Sie die Path-Eigenschaft verwenden können, um eine Bindung an die ClR-Eigenschaften (Common Language Runtime) zu ermöglichen. Betrachten Sie das vorherige Beispiel erneut. Wenn Sie den Rest des Beispiels unverändert lassen und die TextBlock-Bindung wie folgt ändern, werden die Namen der zurückgegebenen XmlNodes in ListBox 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 einigen Anwendungen kann das Einbetten des XML-Codes als Dateninsel in die Quelle der XAML-Seite unangenehm sein, da der genaue Inhalt der Daten zur Kompilierungszeit bekannt sein muss. Daher wird auch das Abrufen der Daten aus einer externen XML-Datei unterstützt, wie im folgenden Beispiel gezeigt:

<XmlDataProvider x:Key="BookData" Source="data\bookdata.xml" XPath="Books"/>

Wenn sich die XML-Daten in einer XML-Remotedatei befinden, definieren Sie den Zugriff auf die Daten, indem Sie dem attribut Source wie folgt eine entsprechende URL zuweisen:

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

Siehe auch