Не могу найти именованные элементы - PullRequest
2 голосов
/ 30 ноября 2010

Что-то не нажимает на меня с этим кодом:

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>

2-я попытка

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 ]

4 голосов
/ 30 ноября 2010

Вы не предоставили пространство имен, которое эффективно наследуется дочерними элементами.Попробуйте это:

var cfgDoc = XElement.Load(_cfgFile);
XNamespace ns = "urn:nhibernate-configuration-2.2";
foreach (var x in cfgDoc.Elements(ns + "property"))
{
    Console.WriteLine(x);
}
2 голосов
/ 30 ноября 2010

Один (или оба) из них могут сделать это:

cfgDoc.Descendants(ns + "property")

и

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

(Джон тоже прав, вам определенно понадобится пространство имен)

1 голос
/ 30 ноября 2010

Вы уверены, что загружаете файл / 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...