如何:使用 XMLDataProvider 和 XPath 查询绑定到 XML 数据
更新:2007 年 11 月
本示例说明如何使用 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 元素(这是设置筛选器所必需的)。
在此示例中,将会显示书名,因为 DataTemplate 中 TextBlock 绑定的 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 是一个 公共语言运行时 (CLR) 对象,这意味着您可以使用 Path 属性绑定到 公共语言运行时 (CLR) 属性。再以上述示例为例。如果该示例的其余部分保持不变,您将 TextBlock 绑定更改为下面的值,那么您将在 ListBox 中看到返回的 XmlNode 的名称。在此情况下,所有返回节点的名称为“Book”。
<TextBlock FontSize="12" Foreground="Red">
<TextBlock.Text>
<Binding Path="Name"/>
</TextBlock.Text>
</TextBlock>
有关完整的代码示例,请参见绑定到 XML 数据的示例。
在某些应用程序中,将 XML 作为 XAML 页的源内的数据岛嵌入可能很不方便,因为在编译时必须知道该数据的确切内容。因此,还支持从外部 XML 文件获取该数据,如下面的示例所示:
<XmlDataProvider x:Key="BookData" Source="data\bookdata.xml" XPath="Books"/>
有关完整的代码示例,请参见带有嵌入数据文件的 XMLDataProvider 的示例。
如果 XML 数据驻留在远程 XML 文件中,那么可以通过将适当的 URL 分配给 Source 属性来定义对该数据的访问,如下所示:
<XmlDataProvider x:Key="BookData" Source="http://MyUrl" XPath="Books"/>
请参见
任务
如何:绑定到 XDocument、XElement 或 LINQ for XML 查询结果