방법: XMLData Provider 및 XPath 쿼리를 사용하여 XML 데이터에 바인딩
이 예제에서는 XmlDataProvider를 사용하여 XML 데이터에 바인딩하는 방법을 보여 줍니다.
XmlDataProvider를 사용하는 경우 애플리케이션에서 데이터 바인딩을 통해 액세스할 수 있는 기본 데이터는 XML 노드의 임의 트리일 수 있습니다. 즉, XmlDataProvider에서는 XML 노드의 트리를 바인딩 소스로 사용하는 편리한 방법을 제공합니다.
예제
다음 예제에서는 데이터가 Resources 섹션 내에 XML 데이터 고립 영역으로 직접 포함됩니다. XML 데이터 고립 영역은 <x:XData>
태그로 래핑되어야 하며, 항상 단일 루트 노드가 있어야 합니다. 이 예에서는 인벤토리입니다.
참고
XML 데이터의 루트 노드에는 XML 네임스페이스를 빈 문자열로 설정하는 xmlns 특성이 있습니다. XAML 페이지에 인라인인 데이터 고립 영역에 XPath 쿼리를 적용하기 위한 요구 사항입니다. 이 인라인의 경우 XAML과 데이터 고립 영역이 System.Windows 네임스페이스를 상속합니다. 따라서 쿼리를 잘못 안내하는 System.Windows 네임스페이스를 통해 XPath 쿼리를 규정하지 않도록 네임스페이스를 공백으로 설정해야 합니다.
<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 값은 책 요소만 노출해야 함을 나타내므로(기본적으로 필터 설정) CD 항목이 반환되지 않습니다.
네 권의 책 제목을 보여주는 XPath 예제의 스크린샷.
이 예에서는 DataTemplate에 있는 TextBlock 바인딩의 XPath가 "제목"으로 설정되어 있으므로 책 제목이 표시됩니다. ISBN과 같은 특성 값을 표시하려면 XPath 값을 "@ISBN
"으로 설정합니다.
WPF의 XPath 속성은 XmlNode.SelectNodes 메서드를 통해 처리됩니다. XPath 쿼리를 수정하여 다른 결과를 얻을 수 있습니다. 다음은 이전 예에서 바인딩된 ListBox의 XPath 쿼리에 대한 몇 가지 예입니다.
XPath="Book[1]"
은 첫 번째 책 요소를 반환합니다(“작동 중인 XML”). XPath 색인은 0이 아니라 1을 기반으로 합니다.XPath="Book[@*]"
에서는 모든 특성이 있는 모든 책 요소를 반환합니다.XPath="Book[last()-1]"
은 끝에서 두 번째인 책 요소를 반환합니다(“Microsoft .NET 소개”).XPath="*[position()>3]"
에서는 처음 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 파일에서 데이터를 가져오는 것도 지원됩니다.
<XmlDataProvider x:Key="BookData" Source="data\bookdata.xml" XPath="Books"/>
XML 데이터가 원격 XML 파일에 있으면 다음과 같이 적절한 URL을 Source 특성에 할당하여 데이터에 대한 액세스 권한을 정의합니다.
<XmlDataProvider x:Key="BookData" Source="http://MyUrl" XPath="Books"/>
참고 항목
.NET Desktop feedback