HOW TO:使用 XMLDataProvider 和 XPath 查詢繫結至 XML 資料
更新:2007 年 11 月
這個範例顯示如何使用 XmlDataProvider 繫結至 XML 資料。
透過 XmlDataProvider,任何 XML 節點樹狀目錄皆可做為在應用程式中經由資料繫結進行存取的基礎資料。換句話說,XmlDataProvider 提供了便利的方式來將任何 XML 節點樹狀目錄做為繫結來源。
範例
下列範例會將資料直接內嵌為 Resources 區段內的 XML 資料島。XML 資料島必須包裝在 <x:XData> 標記中,且一律具有單一根節點,在這個範例中為 Inventory。
注意事項: |
---|
XML 資料的根節點具有 xmlns 屬性 (Attribute),可以將 XML 命名空間設為空字串。將 XPath 查詢套用至 XAML 頁面內的內嵌 (Inline) 資料島時,必須使用這個屬性。在這個內嵌案例中,XAML (包括資料島) 會繼承 System.Windows 命名空間。因此,您必須將命名空間設為空白,使 XPath 查詢不會套用 System.Windows 命名空間,以免錯用查詢。 |
<StackPanel
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
Background="Cornsilk">
<StackPanel.Resources>
<XmlDataProvider x:Key="InventoryData" XPath="Inventory/Books">
<x:XData>
<Inventory >
<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 下 Stock 值為 out 或者 Number 值為 3 或大於等於 8 的所有項目的 Title。請注意,由於 XmlDataProvider 上所設定的 XPath 值表示只應公開 Books 項目 (本質上會設定篩選),因此不會傳回任何 CD 項目。
在這個範例中,因為 DataTemplate 中之 TextBlock 繫結的 XPath 設為 Title,所以會顯示書籍標題。若要顯示屬性 (Attribute) 的值 (如 ISBN),則應該將 XPath 值設為 "@ISBN"。
WPF 中的 XPath 屬性 (Property) 會以 XmlNode.SelectNodes 方法處理。您可以修改 XPath 查詢,以取得不同的結果。下列幾個範例說明上一個範例中已繫結的 ListBox 的 XPath 查詢:
XPath="Book[1]" 會傳回第一個書籍項目 ("XML in Action")。請注意,XPath 索引以 1 為起始,而非 0。
XPath="Book[@*]" 會傳回所有具有屬性 (Attribute) 的書籍項目。
XPath="Book[last()-1]" 會傳回第二個至最後一個書籍項目 ("Introducing Microsoft .NET")。
XPath="*[position()>3]" 會傳回除前三個以外的所有書籍項目。
當您執行 XPath 查詢時,這個查詢會傳回 XmlNode 或 XmlNode 的清單。XmlNode 為 Common Language Runtime (CLR) 物件,這表示您可以使用 Path 屬性 (Property) 繫結至 Common Language Runtime (CLR) 屬性。請再次考量上一個範例。如果您將 TextBlock 繫結變更為下列項目,而範例其餘部分保持不變,您將在 ListBox 中看見所傳回之 XmlNode 的名稱。在這個案例中,所有傳回的節點名稱都將為 Book。
<TextBlock FontSize="12" Foreground="Red">
<TextBlock.Text>
<Binding Path="Name"/>
</TextBlock.Text>
</TextBlock>
如需完整的程式碼範例,請參閱 繫結至 XML 資料範例。
在某些應用程式中,因為在進行編譯時即須取得資料的確切內容,所以可能不便在 XAML 頁面的來源內將 XML 內嵌為資料島。因此,您也可以從外部 XML 檔案取得資料,如下列範例所示:
<XmlDataProvider x:Key="BookData" Source="data\bookdata.xml" XPath="Books"/>
如需完整的程式碼範例,請參閱 XMLDataProvider 與內嵌資料檔範例。
如果 XML 資料位於遠端 XML 檔案中,您就必須指派適當的 URL 給 Source 屬性 (Attribute) 以定義資料存取,如下所示:
<XmlDataProvider x:Key="BookData" Source="http://MyUrl" XPath="Books"/>
請參閱
工作
HOW TO:繫結至 XML 查詢結果的 XDocument、XElement 或 LINQ