2009-08-03 14 views
7

Con este código que puedo conseguir el título del archivo XML siguiente:¿Cómo puedo obtener el primer elemento después de un elemento con LINQ-to-XML?

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

Pero ¿cómo puedo hacer que sea más exacta, por ejemplo, "Obtener el primer elemento después del elemento Smartform, por ejemplo, algo como esto:

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

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

Respuesta

3

Usted desea utilizar el método Descendants eje y luego llamar al método FirstOrDefault extensión a obtener el primer elemento

Aquí está un ejemplo sencillo:.

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

Para añadir un poco a la respuesta de Andrew si usted no sabe si smartForm es el elemento raíz, pero aún desea que el texto del título de la primera entrada que usaría:

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

Este requiere que haya una Elemento SmartForm con un elemento title en algún lugar dentro de él.

Si desea asegurarse de que el elemento de título era un niño inmediata en smartForm puede usar:

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

Si no le importaba lo que el nombre de title era y sólo quería el primer sub Elemento entonces usted usaría:

xml.DescendantsAndSelf("smartForm").Elements().First().Value; 
+0

buena explicación. e.Elements (name) .First() es lo que necesito. –

0

Mi tarea era encontrar el primer hijo del nombre especificado. Si utiliza espacios de nombres XML, que en lugar de

e.Elements(name).FirstOrDefault() 

Escribir

e.Elements().FirstOrDefault(i => i.Name.LocalName == name) 
Cuestiones relacionadas