方法 : XMLDataProvider と XPath クエリを使用して XML データにバインドする
この例では、XmlDataProvider を使用して XML データにバインドする方法を示します。
XmlDataProvider を使用して、アプリケーションでデータ バインディングを介してアクセスできる基になるデータは、XML ノードの任意のツリーです。 つまり、XmlDataProvider とは、XML ノードの任意のツリーをバインディング ソースとして使用するための便利な手段です。
使用例
次の例では、データは XML データ アイランドとして直接 Resources セクションに埋め込まれています。 XML データ アイランドは、<x:XData> タグ内にラップされていることと、常にルート ノードを 1 つだけ (この例では Inventory) 持つことが必要です。
メモ |
---|
XML データのルート ノードには xmlns 属性があり、XML 名前空間が空の文字列に設定されています。これは、XAML ページ内にインラインで配置されるデータ アイランドに XPath クエリを適用する場合の必須事項です。このインラインの場合は、XAML と、必然的にデータ アイランドも System.Windows 名前空間を継承します。このため、XPath クエリが System.Windows 名前空間によって修飾されることを防ぐために、名前空間を空白に設定する必要があります。このようにしなければ、クエリの検索範囲が本来のものとは異なってしまいます。 |
<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>
この例に示すように、同じバインディング宣言を属性構文で作成するには、特殊文字を適切にエスケープする必要があります。 詳細については、「XML 文字エンティティと XAML」を参照してください。
この例を実行すると、次の項目が ListBox に表示されます。 これらは、Books の下のすべての要素のうち、Stock の値が "out" か、Number の値が 3 に等しいか 8 以上のものの Title です。 CD の項目が 1 つも返されないのは、XmlDataProvider の XPath の設定値が、Books 要素のみを公開するように指定されている (フィルターを設定することと同じ) からです。
この例で書籍のタイトルが表示されるのは、DataTemplate 内の TextBlock バインディングの XPath が "Title" に設定されているためです。 属性、たとえば ISBN の値を表示するには、XPath の値を "@ISBN" に設定します。
WPF 内の XPath プロパティは、XmlNode.SelectNodes メソッドによって処理されます。 別の結果を得るために、XPath クエリを変更することもできます。 前の例での、バインドされた ListBox に対する XPath クエリの例を次に示します。
XPath="Book[1]" は、最初の書籍要素 ("XML in Action") を返します。 XPath のインデックスが 0 ではなく 1 から開始することに注意してください。
XPath="Book[@*]" は、任意の属性を持つすべての書籍要素を返します。
XPath="Book[last()-1]" は、最後から 2 番目の書籍要素 ("Introducing Microsoft .NET") を返します。
XPath="*[position()>3]" は、最初の 3 つを除くすべての書籍要素を返します。
XPath クエリを実行すると、1 つの XmlNode または XmlNode のリストが返されます。 XmlNode はcommon language runtime (CLR) オブジェクトです。つまり、Path プロパティを使用してcommon language runtime (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"/>
参照
処理手順
方法 : XDocument、XElement、または LINQ for XML クエリの結果にバインドする
方法 : 階層 XML データでマスター詳細パターンを使用する