2010-11-29 14 views
2

etwas nicht mit diesem Code für mich klicken:Kann nicht Elemente finden genannt

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

I zur Ausgabe nur Knoten in der Lage sein erwarte, dass property genannt werden, aber Zilch bekommen. Wenn ich den Parameter XName verlasse, erhalte ich das Dokument (unten), das zeigt, dass es zumindest korrekt geladen wird.

Was fehlt mir?

<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. versuchen

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

Antwort

2

eine (oder beide) dieser könnte es tun:

cfgDoc.Descendants(ns + "property") 

und

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

(Jon Recht zu, Sie werden auf jeden Fall den Namensraum benötigen)

+2

Ich wollte das vorschlagen, also erkläre ich, warum das einen Unterschied machen würde. Wenn Sie nur XElement.Load ausführen, stellt die zurückgegebene Variable den Stammknoten dar, der sich vom Stammelement unterscheidet. In Ihrer Beispieldatei ist 'session-factory' das Wurzelelement. Der Wurzelknoten ist ein abstraktes Konzept, das die Gesamtheit des Dokuments darstellt und als übergeordnetes Element des Stammelements ('session-factory') betrachtet wird. Um vom Wurzelknoten zu den 'property'-Elementen zu kommen, müssen Sie zuerst' session-factory' durchlaufen. – Simon

+0

Descendants funktioniert. XDoc.Load(). Root tut das nicht. – Berryl

+0

Nun, Root funktioniert auch, aber nur mit Descendents soweit ich sehen kann. Nahe genug, um die Antwort auf das zu sein, was ich gefragt habe! Prost – Berryl

4

Sie haben nicht den Namensraum zur Verfügung gestellt, die tatsächlich von den untergeordneten Elemente vererbt wird. Versuchen Sie folgendes:

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

Hallo Jon. Klingt logisch, aber das gleiche Ergebnis - Zilch (ich habe den Code an das Ende meines Posts angeheftet). – Berryl

1

Sind Sie sicher, dass Sie die Datei/XML laden? Überprüfen Sie Ihren _cfgFile Wert. Ihr zweiter Versuch funktioniert für mich:

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

die Ausgänge:

<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. Meine _cfgFile ist ein Pfad zu einer XML-Datei, von der ich denke, dass sie von den Ergebnissen anders gehandhabt wird, als sie zu erstellen, wie Sie es in Ihrem Snippet getan haben. Wahrscheinlich verwandt mit dem, was Simon's Kommentar sagt. Prost – Berryl

Verwandte Themen