Methode-aanroepen van as (LINQ naar XML) koppelen

Een veelvoorkomend patroon dat u in uw code gaat gebruiken, is door een asmethode aan te roepen en vervolgens een van de assen van de extensiemethode aan te roepen.

Er zijn twee assen met de naam die Elements een verzameling elementen retourneert: de XContainer.Elements methode en de Extensions.Elements methode. U kunt deze twee assen combineren om alle elementen van een opgegeven naam te vinden op een bepaalde diepte in de structuur.

Voorbeeld: Alle naamelementen ophalen

In dit voorbeeld worden XContainer.Elements alle Name elementen in alle Address elementen in alle PurchaseOrder elementen gebruikt en Extensions.Elements opgehaald.

In dit voorbeeld wordt een XML-bestand met het XML-voorbeelddocument gebruikt: Meerdere inkooporders.

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

In dit voorbeeld wordt de volgende uitvoer gegenereerd:

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

Dit werkt omdat een van de implementaties van de Elements as is als uitbreidingsmethode van IEnumerable<T> XContainer. XElement is afgeleid van XContainer, zodat u de Extensions.Elements methode kunt aanroepen op de resultaten van een aanroep naar de XContainer.Elements methode.

Voorbeeld: alle elementen op een bepaalde diepte ophalen

Soms wilt u alle elementen op een bepaalde elementdiepte ophalen wanneer er mogelijk geen tussenliggende voorouders zijn. In het volgende document wilt u bijvoorbeeld alle ConfigParameter elementen ophalen die onderliggende elementen van het Customer element zijn, maar niet het ConfigParameter onderliggende element van het Root element.

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

Hiervoor kunt u de Extensions.Elements as als volgt gebruiken:

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

In dit voorbeeld wordt de volgende uitvoer gegenereerd:

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

Voorbeeld: Elementen ophalen voor XML die zich in een naamruimte bevinden

In het volgende voorbeeld ziet u dezelfde techniek voor XML die zich in een naamruimte bevindt. Zie het overzicht van naamruimten voor meer informatie.

In dit voorbeeld wordt het XML-voorbeeldbestand van het XML-document gebruikt: meerdere inkooporders in een naamruimte.

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

In dit voorbeeld wordt de volgende uitvoer gegenereerd:

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

Zie ook