2010-11-29 51 views
2

自己是不是與此代碼點擊我:無法找到名爲元素

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

我期待着能夠輸出只有名爲property節點,但得到小人物。如果我離開XName參數,我得到文檔(下面),它至少表明它正在正確加載。

我錯過了什麼?

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

回答

2

其中一個(或兩個)可以做到這一點:

cfgDoc.Descendants(ns + "property") 

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

(Jon的右太,你一定會需要的命名空間)

+2

我想提出這個建議,所以我會解釋爲什麼這些會有所作爲。當您僅執行XElement.Load時,返回的變量表示根節點,它與根元素不同。在你的示例文件中,`session-factory`是根元素。根節點是代表整個文檔的抽象概念,並被認爲是根(`session-factory`)元素的父代。爲了從根節點到`property`元素,你必須首先通過`session-factory`。 – Simon 2010-11-29 23:03:02

+0

後裔的作品。 XDoc.Load()。Root不。 – Berryl 2010-11-29 23:16:43

4

您還沒有提供其有效地被孩子繼承元素的命名空間。試試這個:

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

嗨喬恩。聽起來合乎邏輯,但結果相同 - zilch(我將代碼添加到我的帖子末尾)。 – Berryl 2010-11-29 22:32:29

1

您確定要加載文件/ xml嗎?檢查您的_cfgFile值。你的第二個嘗試對我的作品:

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

,輸出:

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