Share via


Como: Bind to XML Data Using an XMLDataProvider and XPath Queries

Esse exemplo mostra como ligar a dados XML utilizando um XmlDataProvider.

Com um XmlDataProvider, os dados subjacentes que podem ser acessados através de ligação de dados na sua aplicação podem ser qulquer árvore de nós XML. Em outras palavras, um XmlDataProvider fornece uma forma conveniente de utilizar qualquer árvore de nós XML como uma fonte de ligação.

Exemplo

No exemplo a seguir, os dados estão embutidos diretamente como uma ilha de dados XML dentro da seção Resources. Uma ilha de dados XML deve ser circundada em marcações <x:XData> e sempre ter um único nó raiz, que nesse exemplo é Inventory.

ObservaçãoObservação:

O nó raiz das XML os dados têm um xmlns atributo que define o XML espaço para nome como uma seqüência de caracteres vazia. Isso é um requisito para aplicar consultas XPath a uma ilha de dados que esteja em linha com a página XAML. Nesse caso em linhas, o XAML e, consequentemente, a ilha de dados, herda do namespace System.Windows. Por causa disso, você precisa definir o namespace em branco para evitar que consultas XPath sejam qualificadas pelo namespace System.Windows, o que enganaria as consultas.

<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>

Como visto nesse exemplo, para criar a mesma declaração de ligação em sintaxe de atributo você precisa fazer o escape dos caracteres especiais adequadamente. Para obter mais informações, consulte Entidades e XAML de caractere XML.

O ListBox vai mostrar os seguintes itens quando o exemplo rodar. Estes são o Títulos de todos os elementos em Livros com qualquer um Estoque o valor de"check-out" or a Número valor de 3 ou maior que ou é igual a 8. Observe que nenhuma CD itens são retornados como a XPath conjunto de valor de XmlDataProvider indica que somente o Livros elementos devem ser expostos (basicamente, definindo um filtro).

Exemplo de XPath

Neste exemplo, os títulos do livro são exibidos porque o XPath do TextBlock ligando com o DataTemplate é definido como "Title". Se você quer exibir o valor de um atributo, tal como ISBN, você definiria aquele valor XPath como @ISBN.

As propriedades XPath no WPF são manipuladas pelo método XmlNode.SelectNodes. Você pode modificar as consultas XPath para obter diferentes resultados. Eis alguns exemplos da consulta XPath na ligação ListBox do exemplo anterior:

  • XPath="Book[1]" vai retornar o primeiro elemento de livro ("XML in Action") Observe que os índices do XPath são baseados em 1, e não em 0.

  • XPath="Book[@*]" vai retornar todos os elementos de livro com quaisquer atributos.

  • XPath="Book[last()-1]" vai retornar o penúltimo elemento de livro ("Introducing Microsoft .NET")

  • XPath="*[position()>3]" vai retornar todos os elementos de livro exceto os 3 primeiros.

Quando você executa um XPath consulta, ele retorna um XmlNode ou uma lista de XmlNodes. XmlNode é um common language runtime (CLR) objeto, o que significa que você pode usar o Path propriedade para BIND a common language runtime (CLR) Propriedades. Considere novamente o exemplo anterior. Se o resto do exemplo permanece o mesmo e você altera a ligação TextBlock ao seguinte, você verá os nomes dos XmlNodes retornados na ListBox. Nesse caso, o nome de todos os nós retornados é "Book".

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

Para o código completo do exemplo, veja VinculParando Para DParados XML exemplo.

Em algumas aplicações, embutir o XML como uma ilha de dados na fonte da página XAML pode ser inconveniente porque o conteúdo exato dos dados precisa ser conhecido em tempo de compilação. Portanto, obter os dados de um arquivo externo XML também é suportado, como no exemplo a seguir:

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

Para o código completo do exemplo, veja XMLDataProvider com o exemplo de arquivo de dados incorporados.

Se os dados XML residem em um arquivo remoto XML, você definiria o acesso aos dados atribuindo uma URL adequada ao atributo Source, como segue:

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

Consulte também

Tarefas

Como: BIND a XDocument, XElement ou LINQ para XML resultados da consulta

Como: Use the Master-Detail Pattern with Hierarchical XML Data

Conceitos

Visão geral sobre associação de fontes

Revisão de Associação de Dados

Referência

ObjectDataProvider

Outros recursos

Exemplos de ligação de dados

Data Binding How-to Topics