Condividi tramite


Procedura: eseguire l'associazione a dati XML tramite un oggetto XMLDataProvider e query XPath

Aggiornamento: novembre 2007

In questo esempio viene illustrato come eseguire l'associazione a dati XML utilizzando XmlDataProvider.

Con XmlDataProvider, i dati sottostanti a cui è possibile accedere attraverso l'associazione dati dell'applicazione possono essere una qualsiasi struttura ad albero di nodi XML. In altre parole, XmlDataProvider offre un modo pratico per utilizzare una qualsiasi struttura ad albero di nodi XML come origine di associazione.

Esempio

Nell'esempio riportato di seguito, i dati sono incorporati direttamente come isola di dati XML nella sezione Resources. Un'isola di dati XML deve essere racchiusa tra tag <x:XData> e deve avere sempre un singolo nodo radice che, in questo esempio, è Inventory.

Nota

Il nodo radice dei dati XML ha un attributo xmlns che imposta lo spazio dei nomi XML su una stringa vuota. Si tratta di un requisito per l'applicazione di query XPath a un'isola di dati inline nella pagina XAML. In questo caso inline, XAML, e di conseguenza l'isola di dati, ereditano lo spazio dei nomi di System.Windows. Per questo motivo, è necessario lasciare vuoto lo spazio dei nomi per impedire che le query XPath siano qualificate dallo spazio dei nomi di System.Windows, che le indirizzerebbe in modo errato.

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

Come illustrato in questo esempio, per creare la stessa dichiarazione di associazione nella sintassi dell'attributo è necessario utilizzare correttamente i caratteri di escape per i caratteri speciali. Per ulteriori informazioni, vedere la classe Entità carattere XML e XAML.

Quando viene eseguito questo esempio, in ListBox saranno visualizzati gli elementi riportati di seguito. Si tratta dei Title di tutti gli elementi in Books con un valore Stock di "out" o un valore Number di 3 o maggiore di o uguale a 8. Si noti che non vengono restituiti elementi CD perché il valore XPath impostato su XmlDataProvider indica che dovrebbero essere esposti solo gli elementi Books (sostanzialmente impostando un filtro).

Esempio di XPath

In questo esempio, i titoli dei libri vengono visualizzati perché XPath dell'associazione TextBlock in DataTemplate è impostato su "Title". Se si desidera visualizzare il valore di un attributo, ad esempio ISBN, è necessario impostare il valore XPath su "@ISBN".

Le proprietà XPath in WPF vengono gestite dal metodo XmlNode.SelectNodes. È possibile modificare le query XPath per ottenere risultati diversi. Di seguito sono riportati alcuni esempi di query XPath eseguite sull'oggetto ListBox associato nell'esempio precedente.

  • XPath="Book[1]" restituirà il primo elemento del libro ("XML nell'azione"). Si noti che gli indici XPath sono basati su 1, non su 0.

  • XPath="Book[@*]" restituirà tutti gli elementi del libro con qualsiasi attributo.

  • XPath="Book[last()-1]" restituirà dal secondo all'ultimo elemento del libro ("Introduzione a Microsoft .NET").

  • XPath="*[position()>3]" restituirà tutti gli elementi del libro ad eccezione dei primi 3.

Quando viene eseguita una query XPath, viene restituito un oggetto XmlNode o un elenco di XmlNodes. XmlNode è un oggetto Common Language Runtime (CLR) e pertanto è possibile utilizzare la proprietà Path per l'associazione alle proprietà Common Language Runtime (CLR). Si consideri nuovamente l'esempio precedente. Se viene lasciato invariato il resto dell'esempio e l'associazione TextBlock viene modificata come indicato di seguito, i nomi degli oggetti XmlNode restituiti saranno visualizzati in ListBox. In questo caso, il nome di tutti i nodi restituiti è "Book".

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

Per l'esempio di codice completo, vedere Esempio di associazione a dati XML.

In alcune applicazioni, incorporare XML come isola di dati nell'origine della pagina XAML può risultare poco pratico perché il contenuto esatto dei dati deve essere conosciuto in fase di compilazione. Pertanto, è anche possibile ottenere i dati da un file XML esterno, come nell'esempio seguente.

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

Per l'esempio di codice completo, vedere Esempio di XMLDataProvider con file di dati incorporato.

Se i dati XML risiedono in un file XML remoto, l'accesso ai dati viene definito assegnando un URL adatto all'attributo Source come indicato di seguito.

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

Vedere anche

Attività

Procedura: eseguire l'associazione ai risultati di una query XDocument, XElement o LINQ to XML

Procedura: utilizzare il modello Master-Details con dati XML gerarchici

Concetti

Cenni preliminari sulle origini di associazione

Cenni preliminari sull'associazione dati

Riferimenti

ObjectDataProvider

Altre risorse

Esempi di associazione dati

Procedure relative all'associazione dati