Практическое руководство. Привязка к данным xml с помощью XMLDataProvider и запросов XPath
В этом примере показано, как выполнить привязку к данным XML с помощью XmlDataProvider.
Для класса XmlDataProvider базовые данные, к которым можно обращаться посредством привязки данных в приложении, могут представлять собой любое дерево узлов XML. Другими словами, XmlDataProvider позволяет легко использовать любое дерево узлов XML в качестве источника привязки.
Пример
В следующем примере данные встраиваются непосредственно как остров данных XML в разделе Resources. Остров данных XML должен быть заключен в теги <x:XData>
и всегда иметь один корневой узел (в данном примере — Инвентаризация).
Примечание.
Корневой узел данных 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 будут отображаться следующие элементы. Это заголовки всех элементов в группе Книги со значением Stock, равным out, или значением Number, равным 3 или больше или равным 8. Обратите внимание, что элементов CD не возвращается, так как значение XPath, установленное в XmlDataProvider, указывает, что предоставляться должны только элементы Books (по сути создается фильтр).
В этом примере отображаются названия книг, так как для параметра XPath привязки TextBlock в DataTemplate установлено значение "Title". Если вы хотите отображать значение атрибута, например, ISBN, следует установить для параметра XPath значение "@ISBN
".
Свойства XPath в WPF обрабатываются методом XmlNode.SelectNodes. Можно изменить запросы XPath для получения других результатов. Вот несколько примеров для запроса XPath в привязке ListBox из предыдущего примера:
XPath="Book[1]"
возвращает первый элемент книги (XML в действии). Обратите внимание, что индексы XPath основаны на 1, а не на 0.XPath="Book[@*]"
возвращает все элементы книги с любыми атрибутами.XPath="Book[last()-1]"
возвращает второй элемент последней книги ("Знакомство с Microsoft .NET").XPath="*[position()>3]"
возвращает все элементы книги, за исключением первых трех.
При запуске запроса XPath он возвращает XmlNode или список XmlNodes. XmlNode является объектом среды CLR, поэтому можно использовать свойство Path для привязки к свойствам среды CLR. Вернемся к нашему предыдущему примеру еще раз. Если остальная часть примера остается неизменной и вы изменяете привязку TextBlock на следующую, то в элементе управления ListBox будут отображаться имена возвращенных XmlNodes. В этом случае все возвращаемые узлы называются "книги".
<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"/>
См. также
.NET Desktop feedback