Zincir eksen yöntem çağrıları (LINQ to XML)

Kodunuzda kullanacağınız yaygın bir desen, bir eksen yöntemini çağırmak ve ardından uzantı yöntemi eksenlerinden birini çağırmaktır.

Bir öğe koleksiyonu döndüren adlı Elements iki eksen vardır: XContainer.Elements yöntemi ve Extensions.Elements yöntemi. Belirtilen adın tüm öğelerini ağaçta belirli bir derinlikte bulmak için bu iki ekseni birleştirebilirsiniz.

Örnek: Tüm ad öğelerini alma

Bu örnek, tüm öğelerdeki tüm öğelerdeki tüm AddressName öğeleri PurchaseOrder almak için ve Extensions.Elements kullanırXContainer.Elements.

Bu örnekte XML belgesi Örnek XML dosyası kullanılır: Birden çok satın alma siparişi.

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

Bu örnek aşağıdaki çıkışı oluşturur:

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

Bu işe yarar çünkü eksenin uygulamalarından Elements biri üzerinde IEnumerable<T>XContainerbir uzantı yöntemidir. XElement yönteminden XContainertüretilir, böylece yöntemine Extensions.Elements yapılan çağrının sonuçlarında yöntemini çağırabilirsiniz XContainer.Elements .

Örnek: Belirli bir derinlikte tüm öğeleri alma

Bazen, belirli bir öğe derinliğindeki tüm öğeleri, araya girmekte olan üst öğeler olmayabilirken almak istersiniz. Örneğin, aşağıdaki belgede öğenin alt Customer öğesi olan tüm ConfigParameter öğeleri almak isteyebilirsiniz, ancak öğenin alt Root öğesi değildirConfigParameter.

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

Bunu yapmak için ekseni aşağıdaki gibi kullanabilirsiniz Extensions.Elements :

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

Bu örnek aşağıdaki çıkışı oluşturur:

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

Örnek: Ad alanındaki XML öğelerini alma

Aşağıdaki örnek, ad alanında bulunan XML için aynı tekniği gösterir. Daha fazla bilgi için bkz . Ad alanlarına genel bakış.

Bu örnekte XML belgesi Örnek XML dosyası kullanılmaktadır: Bir ad alanında birden çok satın alma siparişi.

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

Bu örnek aşağıdaki çıkışı oluşturur:

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

Ayrıca bkz.