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

In questo esempio viene illustrato come eseguire l'associazione ai dati XML usando un oggetto XmlDataProvider.

Con , XmlDataProvideri dati sottostanti a cui è possibile accedere tramite il data binding nell'applicazione possono essere qualsiasi albero di nodi XML. In altre parole, un oggetto XmlDataProvider offre un modo pratico per usare qualsiasi albero di nodi XML come origine di associazione.

Esempio

Nell'esempio seguente i dati vengono incorporati direttamente come isola di dati XML all'interno della Resources sezione . È necessario eseguire il wrapping di un'isola di dati XML nei <x:XData> tag e avere sempre un singolo nodo radice, ovvero Inventory in questo esempio.

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 all'interno della pagina XAML. In questo caso inline, il codice XAML e quindi l'isola dei dati eredita lo System.Windows spazio dei nomi . Per questo motivo, è necessario impostare lo spazio dei nomi vuoto per evitare che le query XPath vengano qualificate dallo System.Windows spazio dei nomi, in modo da indirectory le query.

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

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

L'oggetto ListBox mostrerà gli elementi seguenti quando viene eseguito questo esempio. Questi sono gli elementi Title di tutti gli altri elementi in Books con un valore Stock di "out" o un valore Number di 3 o maggiore o uguale a 8. Si noti che non vengono restituiti elementi CD perché il XPath valore impostato su XmlDataProvider indica che solo gli elementi Books devono essere esposti (essenzialmente impostando un filtro).

Screenshot of the XPath example showing the title of four books.

In questo esempio i titoli dei libri vengono visualizzati perché l'associazione in è impostata su "Titolo".DataTemplateXPathTextBlock Se si desidera visualizzare il valore di un attributo, ad esempio il codice ISBN, impostare tale XPath valore su "@ISBN".

Le proprietà XPath in WPF vengono gestite dal metodo XmlNode.SelectNodes. È possibile modificare le query XPath per ottenere risultati diversi. Ecco alcuni esempi per la XPath query sul limite ListBox dell'esempio precedente:

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

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

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

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

Quando si esegue una query XPath , restituisce un XmlNode oggetto o un elenco di XmlNodes. XmlNode è un oggetto CLR (Common Language Runtime), il che significa che è possibile usare la proprietà per eseguire l'associazione Path alle proprietà CLR (Common Language Runtime). Considerare di nuovo l'esempio precedente. Se il resto dell'esempio rimane invariato e si modifica l'associazione TextBlock nel modo seguente, verranno visualizzati i nomi dei Valori XmlNodes restituiti 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>

In alcune applicazioni, l'incorporamento del codice XML come isola di dati all'interno dell'origine della pagina XAML può risultare scomodo perché il contenuto esatto dei dati deve essere noto in fase di compilazione. Pertanto, è supportato anche ottenere i dati da un file XML esterno, come nell'esempio seguente:

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

Se i dati XML si trovano in un file XML remoto, è necessario definire l'accesso ai dati assegnando un URL appropriato all'attributo Source come indicato di seguito:

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

Vedi anche