Практическое руководство. Привязка к данным 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="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 будут показаны следующие элементы. Таким элементом является Заголовок каждого элемента в Книгах либо со значением Запас — "out", либо со значением Номер — 3 или больше либо равно 8. Обратите внимание, что ни один из элементов Компакт-диск не возвращается, так как значение XPath, заданное для XmlDataProvider, указывает, что следует предоставлять только элементы Книги (то же самое, что и установка фильтра).
В этом примере названия книг отображаются, поскольку XPath у TextBlock выполняющий привязку в DataTemplate установлен в значение "Заголовки". Если необходимо вывести значение атрибута, например 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 или список элементов XmlNode. XmlNode является объектом common language runtime (CLR), что позволяет выполнять привязку к свойствам common language runtime (CLR) с использованием свойства Path. Рассмотрим предыдущий пример еще раз. Если остальную часть примера оставить без изменения, а изменить привязку TextBlock на приведенную ниже, то то будут отображаться имена возвращенных XmlNodes в ListBox. В этом случае именем для всех возвращаемых всех узлов будет являться "Книга".
<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 для результатов запросов XML
Практическое руководство. Использование шаблона "основной-подробности" с иерархическими данными XML
Ссылки
Основные понятия
Общие сведения об источниках привязки
Общие сведения о связывании данных