Bagikan melalui


Cara: Mengikat ke Data XML Menggunakan Kueri XMLDataProvider dan XPath

Contoh ini menunjukkan cara mengikat data XML menggunakan XmlDataProvider.

XmlDataProviderDengan , data mendasar yang dapat diakses melalui pengikatan data di aplikasi Anda dapat berupa pohon simpul XML apa pun. Dengan kata lain, menyediakan cara mudah XmlDataProvider untuk menggunakan pohon simpul XML apa pun sebagai sumber pengikatan.

Contoh

Dalam contoh berikut, data disematkan langsung sebagai pulau data XML di dalam bagian .Resources Pulau data XML harus dibungkus dalam <x:XData> tag dan selalu memiliki satu simpul akar, yang merupakan Inventori dalam contoh ini.

Catatan

Simpul akar data XML memiliki atribut xmlns yang mengatur namespace XML ke string kosong. Ini adalah persyaratan untuk menerapkan kueri XPath ke pulau data yang sebaris dalam halaman XAML. Dalam kasus sebaris ini, XAML, dan dengan demikian pulau data, mewarisi System.Windows namespace layanan. Karena itu, Anda perlu mengatur namespace kosong untuk menjaga kueri XPath tidak memenuhi syarat oleh System.Windows namespace, yang akan salah mengalihkan kueri.

<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>

Seperti yang ditunjukkan dalam contoh ini, untuk membuat deklarasi pengikatan yang sama dalam sintaks atribut, Anda harus menghindari karakter khusus dengan benar. Untuk informasi selengkapnya, lihat Entitas Karakter XML dan XAML.

akan ListBox menampilkan item berikut saat contoh ini dijalankan. Ini adalah Juduldari semua elemen di bawah Buku dengan nilai Saham "keluar" atau Nilai angka 3 atau lebih besar dari atau sama dengan 8. Perhatikan bahwa tidak ada item CD yang dikembalikan karena XPath nilai yang ditetapkan pada XmlDataProvider menunjukkan bahwa hanya elemen Buku yang harus diekspos (pada dasarnya mengatur filter).

Screenshot of the XPath example showing the title of four books.

Dalam contoh ini, judul buku ditampilkan karena XPath pengikatan TextBlock di DataTemplate diatur ke "Judul". Jika Anda ingin menampilkan nilai atribut, seperti ISBN, Anda akan mengatur nilai tersebut XPath ke "@ISBN".

Properti XPath di WPF ditangani oleh metode XmlNode.SelectNodes. Anda dapat mengubah kueri XPath untuk mendapatkan hasil yang berbeda. Berikut adalah beberapa contoh untuk XPath kueri yang terikat ListBox dari contoh sebelumnya:

  • XPath="Book[1]" akan mengembalikan elemen buku pertama ("XML dalam Tindakan"). Perhatikan bahwa indeks XPath didasarkan pada 1, bukan 0.

  • XPath="Book[@*]" akan mengembalikan semua elemen buku dengan atribut apa pun.

  • XPath="Book[last()-1]" akan mengembalikan elemen buku kedua ke terakhir ("Memperkenalkan Microsoft .NET").

  • XPath="*[position()>3]" akan mengembalikan semua elemen buku kecuali untuk 3 pertama.

Saat Anda menjalankan kueri XPath , kueri mengembalikan XmlNode atau daftar XmlNodes. XmlNode adalah objek runtime bahasa umum (CLR), yang berarti Anda dapat menggunakan Path properti untuk mengikat properti runtime bahasa umum (CLR). Pertimbangkan contoh sebelumnya lagi. Jika contoh lainnya tetap sama dan Anda mengubah TextBlock pengikatan ke yang berikut ini, Anda akan melihat nama XmlNodes yang dikembalikan di ListBox. Dalam hal ini, nama semua simpul yang dikembalikan adalah "Buku".

<TextBlock FontSize="12" Foreground="Red">
  <TextBlock.Text>
    <Binding Path="Name"/>
  </TextBlock.Text>
</TextBlock>

Dalam beberapa aplikasi, menyematkan XML sebagai pulau data dalam sumber halaman XAML dapat merepotkan karena konten data yang tepat harus diketahui pada waktu kompilasi. Oleh karena itu, mendapatkan data dari file XML eksternal juga didukung, seperti dalam contoh berikut:

<XmlDataProvider x:Key="BookData" Source="data\bookdata.xml" XPath="Books"/>

Jika data XML berada dalam file XML jarak jauh, Anda akan menentukan akses ke data dengan menetapkan URL yang sesuai ke Source atribut sebagai berikut:

<XmlDataProvider x:Key="BookData" Source="http://MyUrl" XPath="Books"/>  

Baca juga