操作說明:使用 XMLDataProvider 和 XPath 查詢繫結至 XML 資料
此範例示範如何使用 系結至 XML 資料 XmlDataProvider 。
XmlDataProvider透過 ,可以透過應用程式中資料系結存取的基礎資料可以是 XML 節點的任何樹狀結構。 換句話說, XmlDataProvider 提供方便的方式,將 XML 節點的任何樹狀結構當做系結來源使用。
範例
在下列範例中,資料會直接內嵌為 區段中的 Resources XML 資料島 。 XML 資料島必須包裝在標籤中 <x:XData>
,而且一律有單一根節點,在此範例中為 Inventory 。
注意
XML 資料的根節點具有 xmlns 屬性,會將 XML 命名空間設定為空字串。 這是將 XPath 查詢套用至 XAML 頁面中內嵌的資料島的需求。 在此內嵌案例中,XAML,因此資料島會繼承 System.Windows 命名空間。 因此,您必須將命名空間設定為空白,讓 XPath 查詢不受命名空間限定 System.Windows ,這會誤導查詢。
<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>
如此範例所示,若要在屬性語法中建立相同的繫結宣告,您必須正確地逸出特殊字元。 如需詳細資訊,請參閱 XML 字元實體和 XAML。
執行 ListBox 此範例時,會顯示下列專案。 這些是 Books 底下之所有元素的 Title,其有一個 Stock 值為 out,或有一個 Number 值為 3 或大於等於 8 。 請注意,不會傳回任何 CD 專案,因為 XPath 上 XmlDataProvider 設定的值表示只 應該公開 Books 元素(基本上設定篩選準則)。
在此範例中,因為 中的系結設定為 「 Title 」,因此會顯示書籍標題 XPathTextBlock 。 DataTemplate 如果您想要顯示內容的值,例如 ISBN ,您可以將該值 XPath 設定為 「 @ISBN
」。
WPF 中的 XPath 屬性是由 XmlNode.SelectNodes 方法處理。 您可以修改 XPath 查詢,以取得不同的結果。 以下是先前範例所系結 ListBox 之 查詢的一些範例 XPath :
XPath="Book[1]"
會傳回第一個書籍元素 ("XML in Action")。 請注意,XPath 索引以 1 為起始,而非 0。XPath="Book[@*]"
會傳回所有具有屬性的書籍元素。XPath="Book[last()-1]"
會傳回第二個至最後一個書籍元素 ("Introducing Microsoft .NET")。XPath="*[position()>3]"
會傳回除前 3 個以外的所有書籍元素。
當您執行 XPath 查詢時,它會傳 XmlNode 回 或 XmlNodes 清單。 XmlNode 是 Common Language Runtime (CLR) 物件,這表示您可以使用 Path 屬性系結至 Common Language Runtime (CLR) 屬性。 再看一次上一個範例。 如果範例的其餘部分保持不變,而且您將系結變更 TextBlock 為下列內容,您會看到 中 ListBox 傳回的 XmlNodes 名稱。 在這個案例中,所有傳回的節點名稱都將為 Book。
<TextBlock FontSize="12" Foreground="Red">
<TextBlock.Text>
<Binding Path="Name"/>
</TextBlock.Text>
</TextBlock>
在某些應用程式中,將 XML 內嵌為 XAML 頁面來源中的資料島可能會不方便,因為編譯時期必須知道資料的確切內容。 因此,也支援從外部 XML 檔案取得資料,如下列範例所示:
<XmlDataProvider x:Key="BookData" Source="data\bookdata.xml" XPath="Books"/>
如果 XML 資料位於遠端 XML 檔案中,您會將適當的 URL 指派給 Source 屬性,以定義資料的存取權,如下所示:
<XmlDataProvider x:Key="BookData" Source="http://MyUrl" XPath="Books"/>
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應