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