如何:使用 XMLDataProvider 和 XPath 查询绑定到 XML 数据

本示例说明如何使用 XmlDataProvider 绑定到 XML 数据。

使用 XmlDataProvider 时,在应用程序中可通过数据绑定访问的基础数据可以是 XML 节点的任意树。 也就是说,XmlDataProvider 提供一种将 XML 节点的任意树用作绑定源的简便方式。

示例

在下面的示例中,数据是作为 Resources 部分内的 XML 数据岛 直接嵌入的。 XML 数据岛必须包装在 <x:XData> 标记中,并始终具有一个单一根节点,在本示例中根节点为 Inventory

注意注意

XML 数据的根节点具有一个将 XML 命名空间设置为空字符串的 xmlns 特性。将 XPath 查询应用到 XAML 页中内联的数据岛时,需要此属性。在此内联情况下,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 下所有元素的 Title,其中 Stock 值为“out”,Number 值为 3 或者大于或等于 8。 请注意未返回 CD 项,因为在 XmlDataProvider 上设置的 XPath 值指示应仅公开 Books 元素(这是设置筛选器所必需的)。

XPath 示例

在此示例中,将会显示书名,因为 DataTemplateTextBlock 绑定的 XPath 设置为“Title”。 如果您希望显示特性值,如 ISBN,那么应将 XPath 值设置为“@ISBN”。

WPF 中的 XPath 属性是由 XmlNode.SelectNodes 方法处理的。 您可以修改 XPath 查询以获取不同的结果。 下面是上述示例中的绑定 ListBox 上的 XPath 查询的一些示例:

  • XPath="Book[1]" 将返回第一个 Book 元素(“XML in Action”)。 请注意 XPath 索引从 1 而不是从 0 开始。

  • XPath="Book[@*]" 将返回带有任意特性的所有 Book 元素。

  • XPath="Book[last()-1]" 将返回第二个至最后一个 Book 元素(“Introducing Microsoft .NET”)。

  • XPath="*[position()>3]" 将返回除前 3 个元素之外的所有 Book 元素。

当运行 XPath 查询时,它将返回 XmlNode 或 XmlNode 列表。 XmlNode 是一个common language runtime (CLR) 对象,这意味着可以使用 Path 属性绑定到common language runtime (CLR) 属性。 再以上述示例为例。 如果该示例的其余部分保持不变,您将 TextBlock 绑定更改为下面的值,那么您将在 ListBox 中看到返回的 XmlNode 的名称。 在此情况下,所有返回节点的名称为“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"/>

请参见

任务

如何:绑定到 XDocument、XElement 或 LINQ for XML 查询结果

如何:对分层 XML 数据使用主-从模式

参考

ObjectDataProvider

概念

绑定源概述

数据绑定概述

其他资源

数据绑定帮助主题