다음을 통해 공유


방법: 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 항목은 반환되지 않습니다.

XPath 예제

이 예제에서는 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 쿼리 결과에 바인딩

방법: 계층적 XML 데이터에 마스터-세부 패턴 사용

개념

바인딩 소스 개요

데이터 바인딩 개요

참조

ObjectDataProvider

기타 리소스

데이터 바인딩 샘플

데이터 바인딩 방법 항목