找不到命名元素

时间:2010-11-29 22:10:29

标签: c# linq-to-xml

使用此代码没有点击我的信息:

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

我希望能够只输出名为property的节点,但是要获得zilch。如果我将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);
}

3 个答案:

答案 0 :(得分:4)

您尚未提供由子元素有效继承的命名空间。试试这个:

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

答案 1 :(得分:2)

其中一个(或两个)可能会这样做:

cfgDoc.Descendants(ns + "property")

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

(Jon也是,你肯定需要命名空间)

答案 2 :(得分: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>