2009-08-03 14 views
7

Avec ce code, je peux obtenir le titre à partir du fichier XML suivant:Comment puis-je obtenir le premier élément après un élément avec LINQ-to-XML?

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

Mais comment puis-je le rendre plus précis, par exemple « Obtenir le premier élément après l'élément SMARTFORM, par exemple, quelque chose comme ceci:

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

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

Répondre

3

Vous souhaitez utiliser la méthode de l'axe Descendants puis appeler la méthode d'extension FirstOrDefault à obtenir le premier élément

Voici un exemple simple:.

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

Pour ajouter un peu à la réponse d'Andrew si vous ne savez pas si smartForm est l'élément racine mais toujours voulez que le texte du titre de la première telle entrée que vous utilisez:

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

Cette exige qu'il y ait une Élément smartForm avec un élément de titre quelque part en son sein.

Si vous voulez faire en sorte que l'élément de titre était un, vous pouvez utiliser enfant immédiat dans smartForm:

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

Si vous ne l'avez pas attention à ce que le nom de title était et je voulais juste le premier sous élément alors vous utiliseriez:

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

bonne explication. e.Elements (nom) .First() est ce dont j'ai besoin. –

0

Ma tâche était de trouver le premier enfant du nom spécifié. Si xml utilise les espaces de noms, que au lieu de

e.Elements(name).FirstOrDefault() 

Ecrire

e.Elements().FirstOrDefault(i => i.Name.LocalName == name) 
Questions connexes