Megosztás a következőn keresztül:


Útmutató: Kötés XML-adatokhoz XMLDataProvider- és XPath-lekérdezések használatával

Ez a példa bemutatja, hogyan lehet XML-adatokhoz kötést létrehozni egy XmlDataProviderhasználatával.

Egy XmlDataProvideresetén az alkalmazás adatkötésével elérhető mögöttes adatok az XML-csomópontok bármely fáját tartalmazhatják. Más szóval egy XmlDataProvider kényelmes módot kínál az XML-csomópontok bármely fájának kötési forrásként való használatára.

példa

Az alábbi példában az adatok közvetlenül XML-adatszigetként ágyazódnak be a Resources szakaszba. Az XML-adatszigeteket <x:XData> címkékbe kell burkolni, és mindig egyetlen gyökércsomópontot kell tartalmaznia, amely ebben a példában Inventory.

Megjegyzés:

Az XML-adatok gyökércsomópontja egy xmlns attribútummal rendelkezik, amely az XML-névteret üres sztringre állítja. Ez az XPath-lekérdezések XAML-lapon belüli adatszigetre való alkalmazásának követelménye. Ebben a beágyazott esetben az XAML és így az adatsziget örökli a System.Windows névteret. Emiatt üresen kell beállítania a névteret, hogy az XPath-lekérdezéseket ne minősítse a System.Windows névtér, ami félrevezetné a lekérdezéseket.

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

Az ebben a példában látható módon, ha ugyanazt a kötési deklarációt az attribútumszintaxisban szeretné létrehozni, a speciális karaktereket megfelelően kell feloldania. További információ: XML-karakterentitások és XAML-.

A ListBox a következő elemeket jeleníti meg a példa futtatásakor. Ezek a Címaz összes olyan elem közül, amely a Könyvek alatt található, ahol a Készlet értéke "ki" vagy a Szám értéke 3 vagy nagyobb, vagy egyenlő 8-cal. Figyelje meg, hogy nincsenek visszaadva CD és elemek, mert a XPath érték be van állítva a XmlDataProvider-en, jelezve, hogy csak a Könyvek elemek legyenek láthatók (lényegében egy szűrőt állít be).

Képernyőkép az XPath-példáról, amelyen négy könyv címe látható.

Ebben a példában a könyvcímek azért jelennek meg, mert a XPath-ben a TextBlock kötés DataTemplate-ja "Cím" értékre van beállítva. Ha egy attribútum (például az ISBN) értékét szeretné megjeleníteni, akkor ezt a XPath értéket "@ISBN" értékre állítja.

A WPF XPath tulajdonságait az XmlNode.SelectNodes metódus kezeli. A XPath lekérdezéseket módosíthatja a különböző eredmények eléréséhez. Íme néhány példa az előző példából a XPath lekérdezésre a kötött ListBox-n.

  • XPath="Book[1]" visszaadja az első könyv elemet ("XML in Action"). Vegye figyelembe, hogy XPath indexek 1-en alapulnak, nem 0-n.

  • XPath="Book[@*]" visszaad minden könyvelemet, amely bármilyen attribútummal rendelkezik.

  • XPath="Book[last()-1]" a második és az utolsó könyvelemet adja vissza ("A Microsoft .NET bemutatása").

  • XPath="*[position()>3]" az összes könyvelemet visszaadja, kivéve az első hármat.

Ha egy XPath- lekérdezést futtat, az XmlNode vagy XmlNodes-listát ad vissza. XmlNode egy közös nyelvi futtatókörnyezeti (CLR) objektum, ami azt jelenti, hogy a Path tulajdonsággal kapcsolódhat a közös nyelvi futtatókörnyezet (CLR) tulajdonságaihoz. Vegyük újra az előző példát. Ha a példa többi része változatlan marad, és a TextBlock kötést a következőre módosítja, a visszaadott XML-csomópontok neve megjelenik a ListBox-ben. Ebben az esetben az összes visszaadott csomópont neve "Book".

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

Egyes alkalmazásokban az XML adatszigetként való beágyazása az XAML-oldal forrásán belül kényelmetlen lehet, mert az adatok pontos tartalmát fordításkor ismerni kell. Ezért az adatok külső XML-fájlból való lekérése is támogatott, ahogyan az alábbi példában is látható:

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

Ha az XML-adatok egy távoli XML-fájlban találhatók, az adatokhoz való hozzáférést úgy határozhatja meg, hogy egy megfelelő URL-címet rendel hozzá a Source attribútumhoz az alábbiak szerint:

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

Lásd még