Delen via


** Handleiding: Verbinden met XML-gegevens met een XMLDataProvider en XPath-query's gebruiken

In dit voorbeeld ziet u hoe u verbinding maakt met XML-gegevens met behulp van een XmlDataProvider.

Met een XmlDataProviderkunnen de onderliggende gegevens die toegankelijk zijn via gegevensbinding in uw applicatie elke boomstructuur van XML-knooppunten zijn. Met andere woorden, een XmlDataProvider biedt een handige manier om elke structuur van XML-knooppunten als bindingsbron te gebruiken.

Voorbeeld

In het volgende voorbeeld worden de gegevens rechtstreeks ingesloten als een XML-gegevenseiland in de sectie Resources. Een XML-gegevenseiland moet worden verpakt in <x:XData> tags en moet altijd één hoofdknooppunt hebben. Dit is Inventory in dit voorbeeld.

Notitie

Het hoofdknooppunt van de XML-gegevens heeft een xmlns kenmerk waarmee de XML-naamruimte wordt ingesteld op een lege tekenreeks. Dit is een vereiste voor het toepassen van XPath-query's op een gegevenseiland dat inline is op de XAML-pagina. In dit inline geval neemt de XAML, en dus het gegevenseiland, de System.Windows naamruimte over. Daarom moet u de naamruimte leeg instellen om ervoor te zorgen dat XPath-query's niet worden gekwalificeerd door de System.Windows-naamruimte, waardoor de query's verkeerd worden omgeleid.

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

Zoals in dit voorbeeld wordt weergegeven, moet u aan de speciale tekens ontsnappen om dezelfde bindingsdeclaratie in de kenmerksyntaxis te maken. Zie XML-tekenentiteiten en XAML-voor meer informatie.

In de ListBox worden de volgende items weergegeven wanneer dit voorbeeld wordt uitgevoerd. Dit zijn de titelvan alle elementen onder Boeken met een aandelenwaarde waarde "" of een getal waarde van 3 of groter dan of gelijk aan 8. U ziet dat er geen cd- items worden geretourneerd omdat de XPath waarde die is ingesteld op de XmlDataProvider aangeeft dat alleen de Books elementen moeten worden weergegeven (in feite een filter instellen).

Schermopname van het XPath-voorbeeld met de titel van vier boeken.

In dit voorbeeld worden de boektitels weergegeven omdat de XPath van de TextBlock binding in de DataTemplate is ingesteld op 'Titel'. Als u de waarde van een kenmerk wilt weergeven, zoals de ISBN-, stelt u die XPath waarde in op '@ISBN'.

De XPath--eigenschappen in WPF worden verwerkt door de methode XmlNode.SelectNodes. U kunt de XPath--query's wijzigen om verschillende resultaten te verkrijgen. Hier volgen enkele voorbeelden voor de XPath-query op de afhankelijke ListBox uit het vorige voorbeeld:

  • XPath="Book[1]" retourneert het eerste boekelement ('XML in actie'). Houd er rekening mee dat XPath-indexen zijn gebaseerd op 1, niet op 0.

  • XPath="Book[@*]" retourneert alle boekelementen met eventuele kenmerken.

  • XPath="Book[last()-1]" retourneert het tweede tot laatste boekelement ('Introducing Microsoft .NET').

  • XPath="*[position()>3]" retourneert alle boekelementen, met uitzondering van de eerste 3.

Wanneer u een XPath--query uitvoert, wordt er een XmlNode of een lijst met XmlNodes geretourneerd. XmlNode is een CLR-object (Common Language Runtime), wat betekent dat u de eigenschap Path kunt gebruiken om verbinding te maken met de CLR-eigenschappen (Common Language Runtime). Bekijk het vorige voorbeeld opnieuw. Als de rest van het voorbeeld hetzelfde blijft en u de TextBlock binding als volgt wijzigt, ziet u de namen van de geretourneerde XmlNodes in de ListBox. In dit geval is de naam van alle geretourneerde elementen "Book".

<TextBlock FontSize="12" Foreground="Red">
  <TextBlock.Text>
    <Binding Path="Name"/>
  </TextBlock.Text>
</TextBlock>

In sommige toepassingen kan het insluiten van de XML als een gegevenseiland binnen de bron van de XAML-pagina onhandig zijn omdat de exacte inhoud van de gegevens tijdens het compileren bekend moet zijn. Daarom wordt het verkrijgen van de gegevens uit een extern XML-bestand ook ondersteund, zoals in het volgende voorbeeld:

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

Als de XML-gegevens zich in een extern XML-bestand bevinden, definieert u de toegang tot de gegevens door als volgt een juiste URL toe te wijzen aan het kenmerk Source:

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

Zie ook