Vorgehensweise: Schreiben einer Abfrage, die Elemente basierend auf dem Kontext sucht (C#)How to: Write a Query that Finds Elements Based on Context (C#)

Es kann vorkommen, dass Sie eine Abfrage schreiben möchten, die Elemente auf der Grundlage ihres Kontexts sucht.Sometimes you might have to write a query that selects elements based on their context. Dabei soll die Filterung auf den vorausgehenden oder folgenden nebengeordneten Elementen erfolgen.You might want to filter based on preceding or following sibling elements. Außerdem möchten Sie vielleicht auch nach untergeordneten oder indirekt übergeordneten Elementen filtern.You might want to filter based on child or ancestor elements.

Um dies zu bewerkstelligen, können Sie eine Abfrage schreiben und die Ergebnisse dieser Abfrage in der where-Klausel verwenden.You can do this by writing a query and using the results of the query in the where clause. Wenn Sie zunächst eine Prüfung auf NULL-Werte vornehmen müssen und dann den Wert testen, empfiehlt es sich, die Abfrage in einer let-Klausel durchzuführen und die Ergebnisse dann in der where-Klausel zu verwenden.If you have to first test against null, and then test the value, it is more convenient to do the query in a let clause, and then use the results in the where clause.

BeispielExample

Im folgenden Beispiel werden alle p-Elemente ausgewählt, die sofort von einem ul-Element gefolgt werden.The following example selects all p elements that are immediately followed by a ul element.

XElement doc = XElement.Parse(@"<Root>  
    <p id=""1""/>  
    <ul>abc</ul>  
    <Child>  
        <p id=""2""/>  
        <notul/>  
        <p id=""3""/>  
        <ul>def</ul>  
        <p id=""4""/>  
    </Child>  
    <Child>  
        <p id=""5""/>  
        <notul/>  
        <p id=""6""/>  
        <ul>abc</ul>  
        <p id=""7""/>  
    </Child>  
</Root>");  

IEnumerable<XElement> items =  
    from e in doc.Descendants("p")  
    let z = e.ElementsAfterSelf().FirstOrDefault()  
    where z != null && z.Name.LocalName == "ul"  
    select e;  

foreach (XElement e in items)  
    Console.WriteLine("id = {0}", (string)e.Attribute("id"));  

Dieser Code erzeugt die folgende Ausgabe:This code produces the following output:

id = 1  
id = 3  
id = 6  

BeispielExample

Im folgenden Beispiel wird dieselbe Abfrage für XML in einem Namespace gezeigt.The following example shows the same query for XML that is in a namespace. Weitere Informationen finden Sie unter Working with XML Namespaces (C#) (Arbeiten mit XML-Namespaces (C#)).For more information, see Working with XML Namespaces (C#).

XElement doc = XElement.Parse(@"<Root xmlns='http://www.adatum.com'>  
    <p id=""1""/>  
    <ul>abc</ul>  
    <Child>  
        <p id=""2""/>  
        <notul/>  
        <p id=""3""/>  
        <ul>def</ul>  
        <p id=""4""/>  
    </Child>  
    <Child>  
        <p id=""5""/>  
        <notul/>  
        <p id=""6""/>  
        <ul>abc</ul>  
        <p id=""7""/>  
    </Child>  
</Root>");  

XNamespace ad = "http://www.adatum.com";  

IEnumerable<XElement> items =  
    from e in doc.Descendants(ad + "p")  
    let z = e.ElementsAfterSelf().FirstOrDefault()  
    where z != null && z.Name == ad.GetName("ul")  
    select e;  

foreach (XElement e in items)  
    Console.WriteLine("id = {0}", (string)e.Attribute("id"));  

Dieser Code erzeugt die folgende Ausgabe:This code produces the following output:

id = 1  
id = 3  
id = 6  

Siehe auchSee Also

Parse
Descendants
ElementsAfterSelf
FirstOrDefault
Basic Queries (LINQ to XML) (C#) (Standardabfragen (LINQ to XML) (C#))Basic Queries (LINQ to XML) (C#)