views:

445

answers:

2

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>
+2  A: 

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();
    }
}
Andrew Hare
+1  A: 

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