2009-08-03 14 views
7

Con questo codice posso ottenere il titolo dalla seguente file XML:Come posso ottenere il primo elemento dopo un elemento con LINQ-to-XML?

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

Ma come faccio a renderla più precisa, per esempio "Ottenere il primo elemento dopo l'elemento SmartForm, ad esempio, qualcosa di simile:

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

L'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> 

risposta

3

Si desidera utilizzare il metodo Descendants dell'asse e quindi chiamare il metodo FirstOrDefault estensione a ottenere il primo elemento

Ecco un semplice esempio:.

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

Per aggiungere un po 'di risposta di Andrew se non si sa se smartForm è l'elemento principale, ma ancora desidera che il testo del titolo del primo tale voce che si userebbe:

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

Questo richiede che vi sia un elemento smartForm con un elemento titolo da qualche parte al suo interno.

Se ci si vuole assicurare che l'elemento titolo era un figlio diretto in smartForm si potrebbe usare:

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

Se non avete cura di ciò che il nome di title era e voleva solo il primo sub elemento che useresti:

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

buona spiegazione. e.Elements (nome) .First() è ciò di cui ho bisogno. –

0

Il mio compito era quello di trovare il primo figlio del nome specificato. Se XML utilizza gli spazi dei nomi, che invece di

e.Elements(name).FirstOrDefault() 

Scrivi

e.Elements().FirstOrDefault(i => i.Name.LocalName == name) 
Problemi correlati