Edward Tanguay Edward Tanguay - 3 months ago 6
C# Question

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

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>

Answer

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();
    }
}