2010-11-29 90 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>