Udostępnij za pośrednictwem


Jak: wiązać dane XML przy użyciu XMLDataProvider i zapytań XPath

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

W przypadku 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, 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 wyspy danych XML w sekcji . Wyspa danych XML musi być opakowana w tagi <x:XData> i zawsze mieć jeden węzeł główny, który jest Inventory w tym przykładzie.

Notatka

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 język XAML, a tym samym wyspa danych, dziedziczy przestrzeń nazw System.Windows. Aby zapobiec kwalifikowaniu zapytań XPath przez przestrzeń nazw System.Windows, należy ustawić przestrzeń nazw jako pustą, co pozwoli uniknąć błędnego kierowania 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 wyprowadzić znaki specjalne. Aby uzyskać więcej informacji, zobacz Jednostki znaków XML i XAML.

ListBox wyświetli następujące elementy podczas uruchamiania tego przykładu. Są to Tytułs wszystkich elementów w Books z wartością Stock wartości "out" lub Number wartość 3 lub większa lub równa 8. Zauważ, że nie są zwracane żadne elementy CD, ponieważ wartość XPath ustawiona na XmlDataProvider wskazuje, że należy uwidocznić tylko elementy Książki (zasadniczo ustawienie filtru).

Zrzut ekranu z przykładu XPath przedstawiającego tytuł czterech książek.

W tym przykładzie tytuły książek są wyświetlane, ponieważ XPath wiązania TextBlock w DataTemplate jest ustawione na "Tytuł". Jeśli chcesz wyświetlić wartość atrybutu, na przykład ISBN, należy ustawić wartość XPath na wartość "@ISBN".

Właściwości XPath w WPF są obsługiwane przez metodę XmlNode.SelectNodes. Możesz zmodyfikować zapytania XPath, aby uzyskać różne wyniki. Poniżej przedstawiono kilka przykładów dla zapytania XPath na ograniczeniu ListBox z poprzedniego przykładu:

  • XPath="Book[1]" zwróci pierwszy element książki ("XML w działaniu"). 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]" zwróci przedostatni element książki ("Introducing Microsoft .NET").

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

Po uruchomieniu zapytania XPath , zwracany jest XmlNode lub lista węzłów XmlNodes. XmlNode jest obiektem środowiska uruchomieniowego języka wspólnego (CLR), co oznacza, że można użyć właściwości Path 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 powiązanie TextBlock na następujące, w ListBoxzostaną wyświetlone nazwy zwróconych węzłów XmlNode. 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ż