Show / Hide Table of Contents

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

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

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

Пример

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

Note

Корневой узел данных 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. Обратите внимание, что не компакт-диска элементы возвращаются, потому что XPath заданное XmlDataProvider указывает, что только книг элементы должны предоставляться ему (по существу установки фильтра).

XPath Example

В этом примере отображаются названия книг, так как 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 привязке следующего, будут отображаться имена возвращенных 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
  • Использование шаблона "Основной/подробности" с иерархическими XML-данными
  • Общие сведения об источниках привязки
  • Общие сведения о привязке данных
  • Практические руководства
Back to top Неофициальная документация по .NET на русском языке. Лицензия: CC-BY 4.0. Основано на документации по .NET с Microsoft Docs
Generated by DocFX