Procedimiento Enlazar a datos XML mediante XMLDataProvider y consultas XPathHow to: Bind to XML Data Using an XMLDataProvider and XPath Queries

En este ejemplo se muestra cómo enlazar a XMLXML datos mediante un XmlDataProvider.This example shows how to bind to XMLXML data using an XmlDataProvider.

Con un XmlDataProvider, los datos que se pueden acceder mediante enlace de datos en la aplicación subyacentes pueden ser cualquier árbol de XMLXML nodos.With an XmlDataProvider, the underlying data that can be accessed through data binding in your application can be any tree of XMLXML nodes. En otras palabras, un XmlDataProvider proporciona una manera cómoda de utilizar cualquier árbol de XMLXML nodos como origen de enlace.In other words, an XmlDataProvider provides a convenient way to use any tree of XMLXML nodes as a binding source.

EjemploExample

En el ejemplo siguiente, los datos se incrustan directamente como un XMLXML isla de datos dentro de la Resources sección.In the following example, the data is embedded directly as an XMLXML data island within the Resources section. Una isla de datos XMLXML se debe encapsular entre etiquetas <x:XData> y tener siempre un nodo raíz único, que se corresponde con Inventory en este ejemplo.An XMLXML data island must be wrapped in <x:XData> tags and always have a single root node, which is Inventory in this example.

Nota

El nodo raíz de los datos XMLXML tiene un atributo xmlns que establece el espacio de nombres de XMLXML en una cadena vacía.The root node of the XMLXML data has an xmlns attribute that sets the XMLXML namespace to an empty string. Se trata de un requisito para aplicar las consultas XPath a una isla de datos insertada dentro de la página de XAMLXAML.This is a requirement for applying XPath queries to a data island that is inline within the XAMLXAML page. En este caso en línea, el XAMLXAML, y, por tanto, hereda la isla de datos, el System.Windows espacio de nombres.In this inline case, the XAMLXAML, and thus the data island, inherits the System.Windows namespace. Por este motivo, deberá establecer el espacio de nombres en blanco para impedir que las consultas XPath que se va a calificar el System.Windows espacio de nombres, lo que las dirigiría las consultas.Because of this, you need to set the namespace blank to keep XPath queries from being qualified by the System.Windows namespace, which would misdirect the queries.

<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 es preciso crear caracteres de escape correctos para los caracteres especiales.As shown in this example, to create the same binding declaration in attribute syntax you must escape the special characters properly. Para más información, consulte XML Character Entities and XAML (Entidades de caracteres XML y XAML).For more information, see XML Character Entities and XAML.

El ListBox mostrará los elementos siguientes cuando se ejecuta este ejemplo.The ListBox will show the following items when this example is run. Se trata de los elementos Title de todos los elementos que se encuentran bajo Books cuyo valor de Stock sea "out" o cuyo valor de Number sea 3 o mayor o igual que 8.These are the Titles of all of the elements under Books with either a Stock value of "out" or a Number value of 3 or greater than or equals to 8. Tenga en cuenta que ninguna CD se devuelven los elementos porque el XPath valor establecido en el XmlDataProvider indica que solo el libros elementos se deben exponer (básicamente, estableciendo un filtro).Notice that no CD items are returned because the XPath value set on the XmlDataProvider indicates that only the Books elements should be exposed (essentially setting a filter).

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

En este ejemplo, se muestran los títulos de libros porque la XPath de la TextBlock enlace en el DataTemplate está establecido en "título".In this example, the book titles are displayed because the XPath of the TextBlock binding in the DataTemplate is set to "Title". Si desea mostrar el valor de un atributo, como el ISBN, establecería que XPath valor a "@ISBN".If you want to display the value of an attribute, such as the ISBN, you would set that XPath value to "@ISBN".

El método XmlNode.SelectNodes administra las propiedades XPath en WPFWPF.The XPath properties in WPFWPF are handled by the XmlNode.SelectNodes method. Puede modificar las consultas XPath para obtener resultados distintos.You can modify the XPath queries to get different results. Estos son algunos ejemplos para el XPath consultar en el límite ListBox del ejemplo anterior:Here are some examples for the XPath query on the bound ListBox from the previous example:

  • XPath="Book[1]" devolverá el primer elemento de libro ("XML in Action").XPath="Book[1]" will return the first book element ("XML in Action"). Tenga en cuenta que los índices de XPath se basan en 1, no en 0.Note that XPath indexes are based on 1, not 0.

  • XPath="Book[@*]" devolverá todos los elementos con cualquier atributo.XPath="Book[@*]" will return all book elements with any attributes.

  • XPath="Book[last()-1]" devolverá los elementos de libro del segundo al último ("Introducing Microsoft .NET").XPath="Book[last()-1]" will return the second to last book element ("Introducing Microsoft .NET").

  • XPath="*[position()>3]" devolverá todos los elementos de libro excepto los 3 primeros.XPath="*[position()>3]" will return all of the book elements except for the first 3.

Al ejecutar un XPath de consulta, devuelve un XmlNode o una lista de XmlNodes.When you run an XPath query, it returns an XmlNode or a list of XmlNodes. XmlNode es un Common Language Runtime (CLR)common language runtime (CLR) objeto, lo que significa que puede usar el Path se va a enlazar el Common Language Runtime (CLR)common language runtime (CLR) propiedades.XmlNode is a Common Language Runtime (CLR)common language runtime (CLR) object, which means you can use the Path property to bind to the Common Language Runtime (CLR)common language runtime (CLR) properties. Remítase de nuevo al ejemplo anterior.Consider the previous example again. Si el resto del ejemplo permanece igual y cambia el TextBlock enlace al siguiente, verá los nombres de los objetos XmlNodes devueltos en el ListBox.If the rest of the example stays the same and you change the TextBlock binding to the following, you will see the names of the returned XmlNodes in the ListBox. En este caso, el nombre de todos los nodos devueltos es "Book".In this case, the name of all the returned nodes is "Book".

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

En algunas aplicaciones, puede que no sea conveniente incrustar XMLXML como una isla de datos dentro del código fuente de la página XAMLXAML, ya que es imprescindible conocer el contenido exacto de los datos en tiempo de compilación.In some applications, embedding the XMLXML as a data island within the source of the XAMLXAML page can be inconvenient because the exact content of the data must be known at compile time. Por lo tanto, también se admite la obtención de los datos de un archivo XMLXML externo, como en el ejemplo siguiente:Therefore, obtaining the data from an external XMLXML file is also supported, as in the following example:

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

Si el XMLXML datos residen en un control remoto XMLXML archivo, tendría que definir acceso a los datos mediante la asignación de un adecuado ResoluciónURL a la Source atributo como sigue:If the XMLXML data resides in a remote XMLXML file, you would define access to the data by assigning an appropriate ResoluciónURL to the Source attribute as follows:

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

Vea tambiénSee also