Dela via


Anvisningar: Binda till XML-data med hjälp av en XMLDataProvider- och XPath-frågor

Det här exemplet visar hur du binder till XML-data med hjälp av en XmlDataProvider.

Med en XmlDataProviderkan underliggande data som kan nås via databindning i ditt program vara valfritt träd med XML-noder. Med andra ord är en XmlDataProvider ett bekvämt sätt att använda valfritt träd med XML-noder som bindningskälla.

Exempel

I följande exempel bäddas data in direkt som en XML-dataö i avsnittet Resources. En XML-dataö måste vara omsluten i <x:XData> taggar och alltid ha en enda rotnod, vilket är Inventory i det här exemplet.

Obs.

Rotnoden för XML-data har ett xmlns-attribut som anger XML-namnområdet till en tom sträng. Detta är ett krav för att tillämpa XPath-frågor på en dataö som är infogad på XAML-sidan. I fallet där koden är inline ärver XAML och därmed dataön namnområdet System.Windows. Därför måste du ange namnområdet tomt för att förhindra att XPath-frågor kvalificeras av System.Windows namnområdet, vilket skulle vilseleda frågorna.

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

Som du ser i det här exemplet måste du, om du vill skapa samma bindningsdeklaration i attributsyntaxen, undvika specialtecken korrekt. Mer information finns i XML-teckenentiteter och XAML-.

I ListBox visas följande objekt när det här exemplet körs. Det här är Titels för alla elementen under Books med antingen ett Lager-värde på "ut" eller ett Tal-värde på 3 eller större eller lika med 8. Observera att inga CD- objekt returneras eftersom det XPath värde som angetts på XmlDataProvider anger att endast Books- element ska exponeras (i princip ett filter).

Skärmbild av XPath-exemplet som visar titeln på fyra böcker.

I det här exemplet visas boktitlarna eftersom XPath för TextBlock-bindningen i DataTemplate är inställd på "Rubrik". Om du vill visa värdet för ett attribut, till exempel ISBN, anger du det XPath värdet till "@ISBN".

Egenskaperna XPath i WPF hanteras av metoden XmlNode.SelectNodes. Du kan ändra XPath- frågor för att få olika resultat. Här följer några exempel på frågan XPath på det bundna ListBox från föregående exempel.

  • XPath="Book[1]" returnerar det första bokelementet ("XML i åtgärd"). Observera att XPath- index baseras på 1, inte 0.

  • XPath="Book[@*]" returnerar alla bokelement med vilka attribut som helst.

  • XPath="Book[last()-1]" returnerar det näst sista bokelementet ("Introducing Microsoft .NET").

  • XPath="*[position()>3]" returnerar alla bokelement förutom de första 3.

När du kör en XPath- fråga returneras en XmlNode eller en lista med XmlNodes. XmlNode är ett CLR-objekt (Common Language Runtime), vilket innebär att du kan använda egenskapen Path för att binda till clr-egenskaperna (common language runtime). Överväg föregående exempel igen. Om resten av exemplet förblir detsamma och du ändrar TextBlock bindning till följande visas namnen på de returnerade XmlNodes i ListBox. I det här fallet är namnet på alla returnerade noder "Book".

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

I vissa program kan det vara obekvämt att bädda in XML som en dataö i XAML-sidans källa eftersom det exakta innehållet i data måste vara känt vid kompileringen. Därför stöds även hämtning av data från en extern XML-fil, som i följande exempel:

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

Om XML-data finns i en fjärransluten XML-fil definierar du åtkomsten till data genom att tilldela en lämplig URL till attributet Source enligt följande:

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

Se även