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

這個範例示範如何使用來系結至 XML 資料 XmlDataProvider

利用 XmlDataProvider ,您可以透過應用程式中的資料系結來存取的基礎資料,可以是任何 XML 節點的樹狀結構。 換句話說,會 XmlDataProvider 提供一個便利的方式,讓您使用任何 XML 節點樹狀結構作為系結來源。

範例

在下列範例中,資料會直接內嵌為區段內的 XML 資料島 Resources 。 XML 資料島必須包裝在標籤中, <x:XData> 而且一律會有單一根節點,在此範例中為 清查

注意

XML 資料的根節點具有 xmlns 屬性,可將 XML 命名空間設定為空字串。 這是將 XPath 查詢套用至內嵌於 XAML 頁面內之資料島的需求。 在此內嵌案例中,以及 XAML 資料島會繼承 System.Windows 命名空間。 因此,您需要將命名空間設為空白,讓 XPath 查詢免于由 System.Windows 命名空間限定,這會 misdirect 查詢。

<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 表示只會公開 書籍 元素, (基本上是設定篩選) 。

XPath 範例的螢幕擷取畫面,其中顯示四本書的標題。

在此範例中,會顯示書名,因為中系結的 XPath TextBlock DataTemplate 是設定為「標題」。 如果您想要顯示內容的值(例如 ISBN),請將該值設定 XPath 為 " @ISBN "。

WPF中的 XPath 屬性是由 XmlNode.SelectNodes 方法處理。 您可以修改 XPath 查詢,以取得不同的結果。 以下是 XPath 上一個範例所系結的查詢範例 ListBox

  • 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 是通用語言執行平臺 (CLR) 物件,這表示您可以使用 Path 屬性來系結至 common language runtime (clr) 屬性。 再看一次上一個範例。 如果範例的其餘部分保持不變,而且您將系結變更 TextBlock 為下列內容,您將會在中看到傳回之 XmlNodes 的名稱 ListBox 。 在這個案例中,所有傳回的節點名稱都將為 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"/>  

另請參閱