Поделиться через


Практическое руководство. Привязка к данным xml с помощью XMLDataProvider и запросов XPath

Обновлен: Ноябрь 2007

В этом примере показана привязка к данным XML с помощью XmlDataProvider.

С помощью XmlDataProvider к базовым данным можно обращаться через привязку данных в приложении и они могут являться любым деревом узлов XML. Другими словами, XmlDataProvider обеспечивает удобный способ использования любого дерева узлов XML в качестве источника привязки.

Пример

В следующем примере данные внедряются непосредственно как XMLостров данных внутри блока Resources. Остров данных XML должен быть заключен в теги <x:XData> и всегда иметь один корневой узел, которым в этом примере является узел Данные инвентаризации.

ms749287.alert_note(ru-ru,VS.90).gifПримечание.

Корневой узел данных 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 будут показаны следующие элементы. Заголовки всех элементов в группе Книги со значением Количество на складе "нет" либо со значением Количество от 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 или список XmlNodes. XmlNode является объектом среда CLR (common language runtime), что означает, что свойство Path можно использовать для привязки к свойствам среда CLR (common language runtime). Рассмотрим предыдущий пример еще раз. Если остальную часть примера оставить без изменения, а изменить привязку TextBlock на приведенную ниже, то то будут отображаться имена возвращенных XmlNodes в ListBox. В этом случае именем для всех возвращаемых всех узлов будет являться "Книга".

<TextBlock FontSize="12" Foreground="Red">
  <TextBlock.Text>
    <Binding Path="Name"/>
  </TextBlock.Text>
</TextBlock>

Полный пример кода см. в разделе Пример привязки к данным XML.

В некоторых приложениях внедрение XML в качестве острова данных в источник страницы XAML может вызвать неудобство, поскольку точное содержимое данных должно быть известно во время компиляции. Поэтому получение данных из внешнего файла XML также поддерживается, как в следующем примере.

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

Полный пример кода см. в разделе Пример использования объекта XMLDataProvider с внедренным файлом данных.

Если данные XML находятся в удаленном файле XML, то можно определить доступ к данным путем назначения соответствующего URL-адрес для атрибута Source следующим образом:

<XmlDataProvider x:Key="BookData" Source="http://MyUrl" XPath="Books"/>

См. также

Задачи

Практическое руководство. Привязка к XDocument, XElement или LINQ для результатов запросов XML

Практическое руководство. Использование шаблона "основной-подробности" с иерархическими данными XML

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

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

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

Ссылки

ObjectDataProvider

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

Примеры привязки данных

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