共用方式為


操作說明:使用 XMLDataProvider 和 XPath 查詢繫結至 XML 資料

此範例示範如何使用 XmlDataProvider 來繫結到 XML 資料。

使用 XmlDataProvider,可透過應用程式中的資料繫結來存取的基礎資料可以是 XML 節點的任何樹狀結構。 換句話說,XmlDataProvider 提供了一種使用任何 XML 節點樹狀結構作為繫結來源的便捷方法。

範例

在以下範例中,資料會作為 XML 資料島直接內嵌到 Resources 區段中。 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 項目,因為 XmlDataProvider 上設定的 XPath 值指示應僅公開 Books 元素 (基本上是設定篩選條件)。

Screenshot of the XPath example showing the title of four books.顯示四本書標題的 XPath 範例的螢幕擷取畫面。

在此範例中,由於 DataTemplateTextBlock 繫結的 XPath 設定為 "Title",因此顯示了書的標題。 如果您想要顯示某個屬性的值 (例如 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 或 XmlNode 清單。 XmlNode 是通用語言執行平台 (CLR) 物件,這表示您可以使用 Path 屬性來繫結到通用語言執行平台 (CLR) 屬性。 再看一次上一個範例。 如果範例的其餘部分保持不變且您將 TextBlock 繫結變更為以下內容,則您將在 ListBox 中看到傳回的 XmlNode 的名稱。 在這個案例中,所有傳回的節點名稱都將為 Book

<TextBlock FontSize="12" Foreground="Red">
  <TextBlock.Text>
    <Binding Path="Name"/>
  </TextBlock.Text>
</TextBlock>

在某些應用程式中,因為在編譯時即須取得資料的確切內容,所以可能不便在 XAML 頁面的來源內將 XML 內嵌為資料島。 因此,您也可以從外部 XML 檔案取得資料,如下列範例所示:

<XmlDataProvider x:Key="BookData" Source="data\bookdata.xml" XPath="Books"/>

如果 XML 資料位於遠端 XML 檔案中,您可以透過向 Source 屬性指派適當的 URL 來定義對資料的存取,如下所示:

<XmlDataProvider x:Key="BookData" Source="http://MyUrl" XPath="Books"/>  

另請參閱