Bagikan melalui


Cara menautkan panggilan metode sumbu (LINQ ke XML)

Pola umum yang akan Anda gunakan dalam kode Anda adalah memanggil metode sumbu, lalu memanggil salah satu sumbu metode ekstensi.

Ada dua sumbu dengan nama Elements yang mengembalikan kumpulan elemen: metode XContainer.Elements dan metode Extensions.Elements. Anda dapat menggabungkan kedua sumbu ini untuk menemukan semua elemen dari nama tertentu pada kedalaman tertentu di pohon.

Contoh: Mengambil semua elemen nama

Contoh ini menggunakan XContainer.Elements dan Extensions.Elements untuk mengambil semua elemen Name di semua elemen Address di semua elemen PurchaseOrder.

Contohnya menggunakan file XML Sampel dokumen XML: Beberapa pesanan pembelian.

XElement purchaseOrders = XElement.Load("PurchaseOrders.xml");
IEnumerable<XElement> names =
    from el in purchaseOrders
        .Elements("PurchaseOrder")
        .Elements("Address")
        .Elements("Name")
    select el;
foreach (XElement e in names)
    Console.WriteLine(e);
Dim purchaseOrders As XElement = XElement.Load("PurchaseOrders.xml")
Dim names As IEnumerable(Of XElement) = _
    From el In purchaseOrders.<PurchaseOrder>.<Address>.<Name> _
    Select el
For Each e As XElement In names
    Console.WriteLine(e)
Next

Contoh ini menghasilkan output berikut:

<Name>Ellen Adams</Name>
<Name>Tai Yee</Name>
<Name>Cristian Osorio</Name>
<Name>Cristian Osorio</Name>
<Name>Jessica Arnold</Name>
<Name>Jessica Arnold</Name>

Ini berfungsi karena salah satu implementasi sumbu Elements adalah metode ekstensi pada IEnumerable<T>XContainer. XElement berasal dari XContainer, sehingga Anda dapat memanggil metode Extensions.Elements pada hasil panggilan ke metode XContainer.Elements.

Contoh: Mengambil semua elemen pada kedalaman tertentu

Terkadang Anda ingin mengambil semua elemen pada kedalaman elemen tertentu saat mungkin tidak ada pendahulu yang mengintervensi. Misalnya, dalam dokumen berikut, Anda mungkin ingin mengambil semua elemen ConfigParameter yang merupakan turunan elemen Customer, tetapi bukan ConfigParameter yang merupakan turunan elemen Root.

<Root>
  <ConfigParameter>RootConfigParameter</ConfigParameter>
  <Customer>
    <Name>Frank</Name>
    <Config>
      <ConfigParameter>FirstConfigParameter</ConfigParameter>
    </Config>
  </Customer>
  <Customer>
    <Name>Bob</Name>
    <!--This customer doesn't have a Config element-->
  </Customer>
  <Customer>
    <Name>Bill</Name>
    <Config>
      <ConfigParameter>SecondConfigParameter</ConfigParameter>
    </Config>
  </Customer>
</Root>

Untuk melakukan ini, Anda dapat menggunakan sumbu Extensions.Elements, sebagai berikut:

XElement root = XElement.Load("Irregular.xml");
IEnumerable<XElement> configParameters =
    root.Elements("Customer").Elements("Config").
    Elements("ConfigParameter");
foreach (XElement cp in configParameters)
    Console.WriteLine(cp);
Dim root As XElement = XElement.Load("Irregular.xml")
Dim configParameters As IEnumerable(Of XElement) = _
    root.<Customer>.<Config>.<ConfigParameter>
For Each cp As XElement In configParameters
    Console.WriteLine(cp)
Next

Contoh ini menghasilkan output berikut:

<ConfigParameter>FirstConfigParameter</ConfigParameter>
<ConfigParameter>SecondConfigParameter</ConfigParameter>

Contoh: Mengambil elemen untuk XML yang ada di namespace layanan

Contoh berikut menunjukkan kueri yang sama, tetapi untuk XML yang ada di namespace layanan XML. Untuk informasi lebih lanjut, lihat Ringkasan kumpulan nama XML.

Contoh ini menggunakan File XML sampel dokumen XML: Beberapa pesanan pembelian di namespace.

XNamespace aw = "http://www.adventure-works.com";
XElement purchaseOrders = XElement.Load("PurchaseOrdersInNamespace.xml");
IEnumerable<XElement> names =
    from el in purchaseOrders
        .Elements(aw + "PurchaseOrder")
        .Elements(aw + "Address")
        .Elements(aw + "Name")
    select el;
foreach (XElement e in names)
    Console.WriteLine(e);
Imports <xmlns:aw="http://www.adventure-works.com">

Module Module1
    Sub Main()
        Dim purchaseOrders As XElement = XElement.Load("PurchaseOrdersInNamespace.xml")
        Dim names As IEnumerable(Of XElement) = _
            From el In purchaseOrders.<aw:PurchaseOrder>.<aw:Address>.<aw:Name> _
            Select el
        For Each e As XElement In names
            Console.WriteLine(e)
        Next
    End Sub
End Module

Contoh ini menghasilkan output berikut:

<aw:Name xmlns:aw="http://www.adventure-works.com">Ellen Adams</aw:Name>
<aw:Name xmlns:aw="http://www.adventure-works.com">Tai Yee</aw:Name>
<aw:Name xmlns:aw="http://www.adventure-works.com">Cristian Osorio</aw:Name>
<aw:Name xmlns:aw="http://www.adventure-works.com">Cristian Osorio</aw:Name>
<aw:Name xmlns:aw="http://www.adventure-works.com">Jessica Arnold</aw:Name>
<aw:Name xmlns:aw="http://www.adventure-works.com">Jessica Arnold</aw:Name>

Lihat juga