Jak powiązać z danymi XML przy użyciu XMLDataProvider i zapytań XPath

W tym przykładzie pokazano, jak powiązać dane XML przy użyciu elementu XmlDataProvider.

Za pomocą elementu XmlDataProviderbazowe dane, do których można uzyskać dostęp za pośrednictwem powiązania danych w aplikacji, mogą być dowolnym drzewem węzłów XML. Innymi słowy, element XmlDataProvider zapewnia wygodny sposób użycia dowolnego drzewa węzłów XML jako źródła powiązania.

Przykład

W poniższym przykładzie dane są osadzone bezpośrednio jako wyspa danych XML w Resources sekcji . Wyspa danych XML musi być opakowana w <x:XData> tagi i zawsze mieć jeden węzeł główny, który jest spisem w tym przykładzie.

Uwaga

Węzeł główny danych XML ma atrybut xmlns , który ustawia przestrzeń nazw XML na pusty ciąg. Jest to wymóg stosowania zapytań XPath do wyspy danych wbudowanej na stronie XAML. W tym wbudowanym przypadku kod XAML, a zatem wyspa danych dziedziczy System.Windows przestrzeń nazw. W związku z tym należy ustawić przestrzeń nazw pustą, aby zapytania XPath były kwalifikowane przez System.Windows przestrzeń nazw, co spowodowałoby błędne przekierowanie zapytań.

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

Jak pokazano w tym przykładzie, aby utworzyć tę samą deklarację powiązania w składni atrybutu, należy prawidłowo uruchomić znaki specjalne. Aby uzyskać więcej informacji, zobacz Jednostki znaków XML i XAML.

Po ListBox uruchomieniu tego przykładu zostaną wyświetlone następujące elementy. Są to tytuływszystkich elementów w obszarze Książki o wartości akcji "out" lub wartości 3 lub większej lub równej 8. Zwróć uwagę, że nie są zwracane żadne elementy cd , ponieważ XPath wartość ustawiona na XmlDataProvider obiekcie wskazuje, że tylko elementy Książek powinny być uwidocznione (zasadniczo ustawienie filtru).

Screenshot of the XPath example showing the title of four books.

W tym przykładzie tytuły książek są wyświetlane, ponieważ XPathTextBlock powiązanie w obiekcie DataTemplate jest ustawione na "Tytuł". Jeśli chcesz wyświetlić wartość atrybutu, na przykład ISBN, ustaw wartość XPath "@ISBN".

Właściwości XPath w WPF są obsługiwane przez metodę XmlNode.SelectNodes. Zapytania XPath można modyfikować, aby uzyskać różne wyniki. Poniżej przedstawiono kilka przykładów XPath zapytania powiązanego ListBox z poprzednim przykładem:

  • XPath="Book[1]" zwróci pierwszy element książki ("XML w akcji"). Należy pamiętać, że indeksy XPath są oparte na wartości 1, a nie 0.

  • XPath="Book[@*]" zwróci wszystkie elementy książki z dowolnymi atrybutami.

  • XPath="Book[last()-1]" funkcja zwróci drugi do ostatniego elementu książki ("Wprowadzenie do platformy Microsoft .NET").

  • XPath="*[position()>3]" zwróci wszystkie elementy książki z wyjątkiem pierwszych 3.

Po uruchomieniu zapytania XPath zwraca on XmlNode listę xmlNodes lub . XmlNode jest obiektem środowiska uruchomieniowego języka wspólnego (CLR), co oznacza, że można użyć Path właściwości do powiązania z właściwościami środowiska uruchomieniowego języka wspólnego (CLR). Rozważ ponownie poprzedni przykład. Jeśli pozostała część przykładu pozostanie taka sama i zmienisz TextBlock powiązanie na następujące, w zwracanych węzłach XmlNode zobaczysz nazwy zwracanych węzłów XmlNode.ListBox W takim przypadku nazwa wszystkich zwróconych węzłów to "Book".

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

W niektórych aplikacjach osadzanie kodu XML jako wyspy danych w źródle strony XAML może być niewygodne, ponieważ dokładna zawartość danych musi być znana w czasie kompilacji. W związku z tym uzyskiwanie danych z zewnętrznego pliku XML jest również obsługiwane, jak w poniższym przykładzie:

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

Jeśli dane XML znajdują się w zdalnym pliku XML, należy zdefiniować dostęp do danych, przypisując odpowiedni adres URL do atrybutu Source w następujący sposób:

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

Zobacz też