方法: XMLDataProvider クエリと XPath クエリを使用して XML データにバインドする
この例では、XmlDataProviderを使用して XML データにバインドする方法を示します。
XmlDataProviderでは、アプリケーションのデータ バインディングを介してアクセスできる基になるデータは、XML ノードの任意のツリーにすることができます。 言い換えると、XmlDataProvider は、XML ノードのツリーをバインディング ソースとして使用する便利な方法を提供します。
例
次の例では、データは、Resources セクション内の XML データ アイランド として直接埋め込まれます。 XML データアイランドは、
手記
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 項目は返されません (基本的にフィルターの設定)。
この例では、DataTemplate の TextBlock バインドの 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"/>
関連項目
- ObjectDataProvider
- XDocument、XElement、または LINQ for XML クエリ結果へのバインド
- 階層型 XML データ で Master-Detail パターンを使用する
- バインディングソースの概要
- データ バインディングの概要
- の使い方に関するトピック
.NET Desktop feedback