Как привязаться к 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 будут показаны следующие элементы при выполнении этого примера. Это заголовоквсех элементов из Книги с значением "out" или числом, равным 3 или больше либо равным 8. Обратите внимание, что элементы CD не возвращаются, потому что значение XPath, установленное на XmlDataProvider, указывает, что должны быть предоставлены только элементы книг (фактически установив фильтр).
В этом примере отображаются названия книг, так как 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]"
возвратит все элементы книги, кроме первых 3.
При выполнении запроса XPath возвращается XmlNode или список XmlNodes. XmlNode — это объект среды CLR, который означает, что свойство Path можно использовать для привязки к свойствам среды CLR. Рассмотрим предыдущий пример еще раз. Если остальная часть примера остается той же, и вы измените привязку 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"/>
См. также
- ObjectDataProvider
- Привязка к XDocument, XElement или LINQ для результатов XML-запросов
- Использование шаблона Master-Detail с иерархическими XML-данными
- Обзор источников привязки
- Обзор привязки данных
- Темы руководств
.NET Desktop feedback