WPF:数据绑定--Xml数据源

XmlDataSource Xml数据源

实现效果:

  1. 如何使用 XmlDataProvider 绑定到 XML 数据。
  2. 查询或筛选xml特定数据在ListBox中展示

WPF:数据绑定--Xml数据源

关键词:

  1. <Inventory xmlns="">
  2. XPath="[@Stock='out'] | [@Number>=8 or @Number=3]"

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

<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">

ListBox绑定xml数据及模板:
ListBox 将显示下列项。 这些项为 Books 下所有元素的 Title,其中 Stock 值为“ out”, Number 值为 3 或者大于或等于 8。

<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>

当运行 XPath 查询时,它将返回 XmlNode 或 XmlNode 列表。 XmlNode 是一个CLR对象,这意味着可以使用 Path 属性绑定到CLR属性。
扩展:

  1. XML 数据的根节点具有一个将 XML 命名空间设置为空字符串的 xmlns 特性。 将 XPath 查询应用到 XAML 页中内联的数据岛时,需要此属性。 在此内联情况下,XAML 以及数据岛会继承 System.Windows 命名空间。 因此,您需要将命名空间设置为空白,以防止 XPath 查询被 System.Windows 命名空间限定而误导查询。
  2. WPF 中的 XPath 属性是由 XmlNode.SelectNodes 方法处理的。 您可以修改 XPath 查询以获取不同的结果。

    1. XPath="Book[1]" 将返回第一个 Book 元素(“XML in Action”)。 请注意 XPath 索引从 1 而不是从 0 开始。
    2. XPath="Book[@*]" 将返回带有任意特性的所有 Book 元素。
    3. XPath="Book[last()-1]" 将返回第二个至最后一个 Book 元素.
    4. XPath="*[position()>3]" 将返回除前 3 个元素之外的所有 Book 元素。
  3. 在某些应用程序中,将 XML 作为 XAML 页的源内的数据岛嵌入可能很不方便,因为在编译时必须知道该数据的确切内容。 因此,还支持从外部 XML 文件获取该数据,如下面的示例所示:

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

XmlnsBind

要声明 URI 与前缀之间的映射,请创建一个 XmlNamespaceMapping 类,并将该类添加到用作绑定的 XmlNamespaceManager 的 XmlNamespaceMappingCollection 对象。
关键词:

  1. XmlNamespaceManager
  2. XmlNamespaceMapping

如果您的 XML 数据具有以下 XML 命名空间定义:
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1...;>
您可以使用 XmlNamespaceMapping 元素将命名空间映射到 Prefix,

<XmlNamespaceMappingCollection x:Key="Mapping">
    <XmlNamespaceMapping Uri="http://purl.org/dc/elements/1.1/" Prefix="dc" />
</XmlNamespaceMappingCollection>
<XmlDataProvider Source="http://msdn.microsoft.com/subscriptions/rss.xml"
         XmlNamespaceManager="{StaticResource Mapping}"
         XPath="rss/channel/item" x:Key="Provider"/>
         
         
<TextBlock Grid.Row="1" Text="{Binding XPath=dc:date}" />

扩展:

  1. 请注意,您指定的 Prefix 不一定要与 XML 源中使用的前缀相匹配;这样,如果 XML 源中的前缀更改,您的映射仍可以起作用。
  2. 在此特定示例中,XML 数据来自于一个 Web 服务,但 XmlNamespaceMapping 元素还处理内联 XML 或嵌入式文件中的 XML 数据。

相关推荐