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).
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ż
.NET Desktop feedback