Como vincular dados XML usando um XMLDataProvider e consultas XPath
Este exemplo mostra como vincular a dados XML usando um XmlDataProvider.
Com um XmlDataProvider, os dados subjacentes que podem ser acessados por meio da associação de dados na sua aplicação podem constituir qualquer estrutura de árvore de nós XML. Em outras palavras, um XmlDataProvider fornece uma maneira conveniente de usar qualquer árvore de nós XML como uma fonte de ligação.
Exemplo
No exemplo a seguir, os dados são incorporados diretamente como um XML data island na secção Resources. Uma ilha de dados XML deve ser encapsulada em etiquetas <x:XData>
e ter sempre um único nó raiz, que é o Inventory neste caso.
Observação
O nó raiz dos dados XML tem um atributo xmlns que define o namespace XML como uma cadeia de caracteres vazia. Este é um requisito para aplicar consultas XPath a uma ilha de dados que está embutida na página XAML. Nesse caso embutido, o XAML e a ilha de dados herdam, portanto, o namespace System.Windows. Por isso, você precisa definir o namespace em branco para impedir que as consultas XPath sejam qualificadas pelo namespace System.Windows, o que direcionaria incorretamente as consultas.
<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>
Como mostrado neste exemplo, para criar a mesma declaração de vinculação na sintaxe de atributo, você deve escapar dos caracteres especiais corretamente. Para obter mais informações, consulte Entidades de caracteres XML eXAML .
O ListBox mostrará os seguintes itens quando este exemplo for executado. Estes são osde Título
Neste exemplo, os títulos dos livros são exibidos porque a XPath da vinculação de TextBlock no DataTemplate está definida como "Title". Se quiser exibir o valor de um atributo, como o ISBN, defina esse valor XPath como "@ISBN
".
As propriedades XPath em WPF são manipuladas pelo método XmlNode.SelectNodes. Você pode modificar o XPath consultas para obter resultados diferentes. Aqui estão alguns exemplos para a consulta XPath no limite ListBox do exemplo anterior:
XPath="Book[1]"
retornará o primeiro elemento book ("XML em Ação"). Observe que os índices XPath são baseados em 1, não em 0.XPath="Book[@*]"
retornará todos os elementos do livro com quaisquer atributos.XPath="Book[last()-1]"
retornará o penúltimo elemento do livro ("Apresentando o Microsoft .NET").XPath="*[position()>3]"
retornará todos os elementos do livro, exceto os 3 primeiros.
Quando você executa um XPath consulta, ele retorna um XmlNode ou uma lista de XmlNodes. XmlNode é um objeto CLR (Common Language Runtime), o que significa que você pode usar a propriedade Path para vincular às propriedades CLR (Common Language Runtime). Considere o exemplo anterior novamente. Se o restante do exemplo se mantiver o mesmo e ao alterares a ligação de TextBlock para a seguinte, irás ver os nomes dos XmlNodes retornados no ListBox. Neste caso, o nome de todos os nós retornados é "Livro".
<TextBlock FontSize="12" Foreground="Red">
<TextBlock.Text>
<Binding Path="Name"/>
</TextBlock.Text>
</TextBlock>
Em alguns aplicativos, incorporar o XML como uma ilha de dados na origem da página XAML pode ser inconveniente porque o conteúdo exato dos dados deve ser conhecido em tempo de compilação. Portanto, a obtenção de dados de um arquivo XML externo também é suportada, como no exemplo a seguir:
<XmlDataProvider x:Key="BookData" Source="data\bookdata.xml" XPath="Books"/>
Se os dados XML residirem em um arquivo XML remoto, você definirá o acesso aos dados atribuindo uma URL apropriada ao atributo Source da seguinte maneira:
<XmlDataProvider x:Key="BookData" Source="http://MyUrl" XPath="Books"/>
Ver também
.NET Desktop feedback