2010-11-29 7 views
2

Quelque chose ne clique pas pour moi avec ce code:ne peut pas trouver le nom des éléments

var cfgDoc = XElement.Load(_cfgFile); 
foreach (var x in cfgDoc.Elements("property")) 
{ 
    Console.WriteLine(x); 
} 

Je comptais être en mesure de sortie seulement des noeuds qui sont nommés property, mais obtenir zilch. Si je laisse le paramètre XName, j'obtiens le document (ci-dessous), qui montre au moins qu'il est chargé correctement.

Qu'est-ce qui me manque?

<session-factory xmlns="urn:nhibernate-configuration-2.2"> 
    <property name="connection.release_mode">on_close</property> 
    <property name="show_sql">true</property> 
</session-factory> 

2ème essai

var cfgDoc = XElement.Load(_cfgFile); 
XNamespace ns = "urn:nhibernate-configuration-2.2"; 
var properties = cfgDoc.Elements(ns + "property"); 
Assert.That(properties.Count() > 0); 
foreach (var x in cfgDoc.Elements(ns + "property")) 
{ 
    Console.WriteLine(x); 
} 

Répondre

2

un (ou les deux) d'entre elles pourraient le faire:

cfgDoc.Descendants(ns + "property") 

et

var cfgDoc = XDocument.Load(_cfgFile).Root; 

(droit de Jon aussi, vous aurez certainement besoin de l'espace de noms)

Etes-vous sûr de vouloir charger le fichier/xml?
+2

J'allais le suggérer, alors je vais expliquer pourquoi cela ferait une différence. Lorsque vous ne faites que XElement.Load, la variable renvoyée représente le nœud racine, qui est distinct de l'élément racine. Dans votre fichier exemple, 'session-factory' est l'élément racine. Le nœud racine est un concept abstrait représentant l'intégralité du document et est considéré comme le parent de l'élément racine ('session-factory'). Pour passer du noeud racine aux éléments 'property', vous devez d'abord passer par' session-factory'. – Simon

+0

Descendants fonctionne. XDoc.Load(). La racine ne le fait pas. – Berryl

+0

Eh bien, Racine fonctionne aussi, mais seulement avec Descendants aussi loin que je peux voir. Assez proche pour être la réponse à ce que j'ai demandé tho! Salutations – Berryl

4

Vous n'avez pas fourni l'espace de noms qui est effectivement hérité par les éléments de l'enfant. Essayez ceci:

var cfgDoc = XElement.Load(_cfgFile); 
XNamespace ns = "urn:nhibernate-configuration-2.2"; 
foreach (var x in cfgDoc.Elements(ns + "property")) 
{ 
    Console.WriteLine(x); 
} 
+0

Salut Jon. Cela semble logique, mais le même résultat - zilch (j'ai viré sur le code à la fin de mon post). – Berryl

1

Vérifiez votre valeur _cfgFile. Votre 2ème essai fonctionne pour moi:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml.Linq; 
using System.IO; 

namespace XElementMadness 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var xml = "<session-factory xmlns=\"urn:nhibernate-configuration-2.2\"><property name=\"connection.release_mode\">on_close</property><property name=\"show_sql\">true</property></session-factory>"; 

      var cfgDoc = XElement.Load(new StringReader(xml)); 
      XNamespace ns = "urn:nhibernate-configuration-2.2"; 
      var properties = cfgDoc.Elements(ns + "property"); 

      foreach (var x in cfgDoc.Elements(ns + "property")) 
      { 
       Console.WriteLine(x); 
      } 

      Console.ReadLine(); 
     } 
    } 
} 

qui sort:

<property name="connection.release_mode" xmlns="urn:nhibernate-configuration-2.2 ">on_close</property> <property name="show_sql" xmlns="urn:nhibernate-configuration-2.2">true</property> 
+0

Aaron. Mon _cfgFile est un chemin vers un fichier xml, qui, je suppose, à partir des résultats est géré différemment de la façon dont vous l'avez fait dans votre extrait. Probablement lié à ce que dit le commentaire de Simon. À votre santé – Berryl

Questions connexes