Compartir a través de


Cómo: Enlazar a datos XML mediante consultas XMLDataProvider y XPath

En este ejemplo se muestra cómo enlazar a datos XML mediante .XmlDataProvider

Con un XmlDataProvider, los datos subyacentes a los que se puede acceder a través del enlace de datos en su aplicación pueden ser cualquier árbol de nodos XML. En otras palabras, un XmlDataProvider proporciona una manera cómoda de usar cualquier árbol de nodos XML como origen de enlace.

Ejemplo

En el ejemplo siguiente, los datos se incrustan directamente como un XML isla de datos dentro de la sección Resources. Una isla de datos XML debe encapsularse en <x:XData> etiquetas y siempre tener un único nodo raíz, que es Inventory en este ejemplo.

Nota:

El nodo raíz de los datos XML tiene un atributo xmlns que establece el espacio de nombres XML en una cadena vacía. Este es un requisito para aplicar consultas XPath a una isla de datos insertada dentro de la página XAML. En este caso integrado, el XAML y, por tanto, la isla de datos, heredan el System.Windows espacio de nombres. Por este motivo, debe establecer el espacio de nombres en blanco para evitar que las consultas XPath estén calificadas por el System.Windows espacio de nombres, lo que podría desviar las consultas de forma incorrecta.

<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 se muestra en este ejemplo, para crear la misma declaración de enlace en la sintaxis de atributo, debe escapar los caracteres especiales correctamente. Para obtener más información, consulta Entidades de caracteres XML y XAML.

ListBox mostrará los siguientes elementos cuando se ejecute este ejemplo. Estos son los títulos de todos los elementos de Libros con un valor de Stock de "out" o un valor Number de 3 o mayor o igual a 8. Observe que no se devuelve ningún elemento de CD porque el valor establecido en el XPath indica que solo deben exponerse los elementos XmlDataProvider (básicamente estableciendo un filtro).

Captura de pantalla del ejemplo de XPath que muestra el título de cuatro libros.

En este ejemplo, los títulos del libro se muestran porque la XPathTextBlock de la encuadernación en el DataTemplate está establecida en "Título". Si desea mostrar el valor de un atributo, como el ISBN, establecería ese XPath valor en "@ISBN".

Las propiedades XPath de WPF se controlan mediante el método XmlNode.SelectNodes. Puede modificar las consultas XPath para obtener resultados diferentes. Estos son algunos ejemplos de la XPath consulta en el vinculado ListBox del ejemplo anterior.

  • XPath="Book[1]" devolverá el primer elemento de libro ("XML en acción"). Tenga en cuenta que los índices XPath se basan en 1, no en 0.

  • XPath="Book[@*]" devolverá todos los elementos de libro con cualquier atributo.

  • XPath="Book[last()-1]" devolverá el penúltimo elemento de libro ("Introducción a Microsoft .NET").

  • XPath="*[position()>3]" devolverá todos los elementos del libro excepto los primeros 3.

Al ejecutar una consulta XPath , devuelve una XmlNode o una lista de XmlNodes. XmlNode es un objeto de Common Language Runtime (CLR), lo que significa que puede usar la Path propiedad para enlazar a las propiedades de Common Language Runtime (CLR). Considere de nuevo el ejemplo anterior. Si el resto del ejemplo sigue siendo el mismo y cambia la TextBlock vinculación a lo siguiente, verá los nombres de los XmlNodes devueltos en el ListBox. En este caso, el nombre de todos los nodos devueltos es "Book".

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

En algunas aplicaciones, insertar el XML como una isla de datos dentro del origen de la página XAML puede ser inconveniente porque el contenido exacto de los datos debe conocerse en tiempo de compilación. Por lo tanto, también se admite la obtención de los datos de un archivo XML externo, como en el ejemplo siguiente:

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

Si los datos XML residen en un archivo XML remoto, definiría el acceso a los datos asignando una dirección URL adecuada al atributo de la Source siguiente manera:

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

Consulte también