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


Как привязаться к 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, показывающего заголовки четырех книг.

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

См. также