次の方法で共有


方法: XMLDataProvider クエリと XPath クエリを使用して XML データにバインドする

この例では、XmlDataProviderを使用して XML データにバインドする方法を示します。

XmlDataProviderでは、アプリケーションのデータ バインディングを介してアクセスできる基になるデータは、XML ノードの任意のツリーにすることができます。 言い換えると、XmlDataProvider は、XML ノードのツリーをバインディング ソースとして使用する便利な方法を提供します。

次の例では、データは、Resources セクション内の XML データ アイランド として直接埋め込まれます。 XML データアイランドは、 タグでラップし、常に単一のルート ノードを持つ必要があります。これは、この例では Inventory です。

手記

XML データのルート ノードには、XML 名前空間を空の文字列に設定する xmlns 属性があります。 これは、XAML ページ内のインラインであるデータ アイランドに XPath クエリを適用するための要件です。 このインラインの場合、XAML とデータ アイランドは、System.Windows 名前空間を継承します。 このため、XPath クエリが System.Windows 名前空間によって修飾されないようにするには、名前空間を空白に設定する必要があります。これにより、クエリの方向が誤ります。

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

この例に示すように、属性構文で同じバインド宣言を作成するには、特殊文字を適切にエスケープする必要があります。 詳細については、「XML 文字エンティティと XAML」を参照してください。

この例を実行すると、ListBox には次の項目が表示されます。 これらは、書籍 のすべての要素に関する タイトルで、ストック の値が「out」であるか、数値 の値が3または8以上であるものです。 XmlDataProvider に設定された XPath 値は、Books 要素のみを公開する必要があることを示しているため、CD 項目は返されません (基本的にフィルターの設定)。

4 冊の書籍のタイトルを示す XPath の例のスクリーンショット。

この例では、DataTemplateTextBlock バインドの XPath が "Title" に設定されているため、書籍のタイトルが表示されます。 ISBNなど、属性の値を表示する場合は、その XPath 値を "@ISBN" に設定します。

WPF の XPath プロパティは、XmlNode.SelectNodes メソッドによって処理されます。 XPath クエリを変更して、さまざまな結果を取得できます。 前の例のバインドされた ListBox に対する XPath クエリの例を次に示します。

  • XPath="Book[1]" は、最初の book 要素 ("XML in Action") を返します。 XPath インデックス は 0 ではなく 1 に基づいていることに注意してください。

  • XPath="Book[@*]" は、任意の属性を持つすべての書籍要素を返します。

  • XPath="Book[last()-1]" は、2 番目から最後の book 要素 ("Introducing Microsoft .NET") を返します。

  • XPath="*[position()>3]" は、最初の 3 つを除くすべての book 要素を返します。

XPath クエリを実行すると、XmlNode または XmlNodes の一覧が返されます。 XmlNode は共通言語ランタイム (CLR) オブジェクトです。つまり、Path プロパティを使用して共通言語ランタイム (CLR) プロパティにバインドできます。 前の例をもう一度考えてみましょう。 この例の残りの部分が同じままで、TextBlock バインドを次のように変更すると、返された XmlNode の名前が ListBoxに表示されます。 この場合、返されるすべてのノードの名前は "Book" です。

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

一部のアプリケーションでは、XAML ページのソース内に XML をデータ アイランドとして埋め込むのは、コンパイル時にデータの正確な内容を知る必要があるため、不便な場合があります。 そのため、次の例のように、外部 XML ファイルからデータを取得することもサポートされています。

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

XML データがリモート XML ファイルに存在する場合は、次のように適切な URL を Source 属性に割り当てることで、データへのアクセスを定義します。

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

関連項目