Практическое руководство. Привязка к данным 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

В этом примере названия книг отображаются, поскольку 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

Ссылки

ObjectDataProvider

Основные понятия

Общие сведения об источниках привязки

Общие сведения о связывании данных

Другие ресурсы

Практические руководства по привязке данных