방법: XMLData Provider 및 XPath 쿼리를 사용하여 XML 데이터에 바인딩
업데이트: 2007년 11월
이 예제에서는 XmlDataProvider를 사용하여 XML 데이터에 바인딩하는 방법을 보여 줍니다.
XmlDataProvider를 사용할 경우 응용 프로그램에서 데이터 바인딩을 통해 액세스할 수 있는 내부 데이터는 XML 노드의 트리일 수 있습니다. 즉, XmlDataProvider를 사용하면 XML 노드의 트리를 바인딩 소스로 손쉽게 사용할 수 있습니다.
예제
다음 예제에서는 데이터를 Resources 섹션 내에 직접 XML 데이터 아일랜드로 포함합니다.XML 데이터 아일랜드는 <x:XData> 태그에 래핑되어야 하며 항상 단일 루트 노드(이 예제에서는 Inventory)를 포함하고 있어야 합니다.
참고
XML 데이터의 루트 노드에는 XML 네임스페이스를 빈 문자열로 설정하는 xmlns 특성이 있습니다. 이 특성은 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보다 크거나 같은 모든 요소의 Titles입니다. XmlDataProvider에서 설정한 XPath 값은 Books 요소만 노출된다는 것을 나타내므로(기본적으로 필터 설정) CD 항목은 반환되지 않습니다.
이 예제에서는 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]"은 마지막에서 두 번째 책 요소("Introducing Microsoft .NET")를 반환합니다.
XPath="*[position()>3]"는 처음 세 개를 제외한 모든 책 요소를 반환합니다.
XPath 쿼리를 실행하면 XmlNode 또는 XmlNodes 목록을 반환합니다. XmlNode는 CLR(공용 언어 런타임) 개체이므로 Path 속성을 사용하여 CLR(공용 언어 런타임) 속성에 바인딩할 수 있습니다. 앞의 예제를 다시 살펴봅니다. 예제의 나머지는 그대로 두고 TextBlock 바인딩을 다음과 같이 변경하면 ListBox에 반환된 XmlNodes의 이름이 표시됩니다. 이 경우 반환된 모든 노드의 이름은 "Book"입니다.
<TextBlock FontSize="12" Foreground="Red">
<TextBlock.Text>
<Binding Path="Name"/>
</TextBlock.Text>
</TextBlock>
전체 코드 샘플을 보려면 XML 데이터 바인딩 샘플을 참조하십시오.
일부 응용 프로그램에서는 XAML 페이지의 소스 내에 XML을 데이터 아일랜드로 포함하면 컴파일할 때 정확한 데이터 내용이 알려져야 하기 때문에 불편할 수 있습니다. 따라서 다음 예제와 같이 외부 XML 파일에서 데이터를 가져올 수도 있습니다.
<XmlDataProvider x:Key="BookData" Source="data\bookdata.xml" XPath="Books"/>
전체 코드 샘플을 보려면 포함 데이터 파일이 있는 XMLDataProvider 샘플을 참조하십시오.
XML 데이터가 원격 XML 파일에 있는 경우 다음과 같이 Source 특성에 적절한 URL을 할당하여 데이터에 대한 액세스를 정의할 수 있습니다.
<XmlDataProvider x:Key="BookData" Source="http://MyUrl" XPath="Books"/>
참고 항목
작업
방법: XDocument, XElement 또는 LINQ for XML 쿼리 결과에 바인딩