방법: 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 쿼리를 수정하여 다른 결과를 얻을 수 있습니다. 다음은 이전 예에서 바인딩된 ListBoxXPath 쿼리에 대한 몇 가지 예입니다.

  • 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"/>  

참고 항목