How can I get the first element after an element with LINQ-to-XML?

17,277

Solution 1

You want to use the Descendants axis method and then call the FirstOrDefault extension method to get the first element.

Here is a simple example:

using System;
using System.Linq;
using System.Xml.Linq;

class Program
{
    static void Main()
    {
        String xml = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
            <smartForm idCode=""customersMain"">
                <title>Customers Main222</title>
                <description>Generic customer form.</description>
                <area idCode=""generalData"" title=""General Data"">
                <column>
                    <group>
                    <field idCode=""anrede"">
                        <label>Anrede</label>
                    </field>
                    <field idCode=""firstName"">
                        <label>First Name</label>
                    </field>
                    <field idCode=""lastName"">
                        <label>Last Name</label>
                    </field>
                    </group>
                </column>
                </area>
                <area idCode=""address"" title=""Address"">
                <column>
                    <group>
                    <field idCode=""street"">
                        <label>Street</label>
                    </field>
                    <field idCode=""location"">
                        <label>Location</label>
                    </field>
                    <field idCode=""zipCode"">
                        <label>Zip Code</label>
                    </field>
                    </group>
                </column>
                </area>
            </smartForm>";

        XElement element = XElement.Parse(xml)
            .Descendants()
            .FirstOrDefault();
    }
}

Solution 2

To add slightly to Andrew's answer if you do not know whether smartForm is the root element but still want the title text of the first such entry you would use:

xml.DescendantsAndSelf("smartForm").Descendants("title").First().Value;

This requires that there be a smartForm element with a title element somewhere within it.

If you wanted to ensure that the title element was an immediate child in smartForm you could use:

xml.DescendantsAndSelf("smartForm").Elements("title").First().Value;

If you didn't care what the name of title was and just wanted the first sub element then you would use:

xml.DescendantsAndSelf("smartForm").Elements().First().Value;
Share:
17,277
Angry Dan
Author by

Angry Dan

web/software developer, .NET, C#, WPF, PHP, software trainer, English teacher, have philosophy degree, love languages, run marathons my tweets: http://www.twitter.com/edward_tanguay my runs: http://www.tanguay.info/run my code: http://www.tanguay.info/web my publications: PHP 5.3 training video (8 hours, video2brain) my projects: http://www.tanguay.info

Updated on June 20, 2022

Comments

  • Angry Dan
    Angry Dan almost 2 years

    With this code I can get the title out of the following XML file:

    var xml = XElement.Load (@"C:\\test\\smartForm-customersMain.xml");
    string title = xml.Element("title").Value;
    

    But how do I make it more exact, e.g. "get the first element after the smartForm element, e.g. something like this:

    //PSEUDO-CODE:
    string title = xml.Element("smartForm").FirstChild("title");
    

    The XML:

    <?xml version="1.0" encoding="utf-8" ?>
    <smartForm idCode="customersMain">
        <title>Customers Main222</title>
        <description>Generic customer form.</description>
        <area idCode="generalData" title="General Data">
            <column>
                <group>
                    <field idCode="anrede">
                        <label>Anrede</label>
                    </field>
                    <field idCode="firstName">
                        <label>First Name</label>
                    </field>
                    <field idCode="lastName">
                        <label>Last Name</label>
                    </field>
                </group>
            </column>
        </area>
        <area idCode="address" title="Address">
            <column>
                <group>
                    <field idCode="street">
                        <label>Street</label>
                    </field>
                    <field idCode="location">
                        <label>Location</label>
                    </field>
                    <field idCode="zipCode">
                        <label>Zip Code</label>
                    </field>
                </group>
            </column>
        </area>
    </smartForm>