Что не так с моим простым запросом? - PullRequest
0 голосов
/ 19 февраля 2009

Я новичок в Linq для Xml. У меня есть очень простой XML-файл, как это:

<Items>
    <Item>
       <Stuff>Strings</Stuff>
    </Item>
    <Item>
       <Stuff>Strings</Stuff>
    </Item>
</Items>

И я пытаюсь запросить это так:

XDocument doc = XDocument.Load(myStream)
from node in doc.Descendants(XName.Get("Item"))
    select new { Stuff = node.Element(XName.Get("Stuff")).Value }

Но doc.Descendents (XName.Get ("Item")) возвращает ноль. Что-то не так с моим пониманием здесь.

Ответы [ 3 ]

1 голос
/ 19 февраля 2009

Ваш код действительно работает:

static void Main(string[] args)
{
    string xml = @"
                <Items>
                    <Item>
                        <Stuff>Strings</Stuff>
                    </Item>
                    <Item>
                        <Stuff>Strings</Stuff>
                    </Item>
                </Items>";

    using (StringReader myStream = new StringReader(xml))
    {
        XDocument doc = XDocument.Load(myStream);

        var query = from node in doc.Descendants(XName.Get("Item"))
                    select new { Stuff = 
                        node.Element(XName.Get("Stuff")).Value };

        foreach (var item in query)
        {
            Console.WriteLine("Stuff: {0}", item.Stuff);
        }
    }

Следует отметить, что если элементы не соответствуют пространствам имен, XName вам на самом деле не нужен:

static void Main(string[] args)
{
    string xml = @"
                <Items>
                    <Item>
                        <Stuff>Strings</Stuff>
                    </Item>
                    <Item>
                        <Stuff>Strings</Stuff>
                    </Item>
                </Items>";

    using (StringReader myStream = new StringReader(xml))
    {
        XDocument doc = XDocument.Load(myStream);

        var query = from node in doc.Descendants("Item")
                    select new { Stuff = node.Element("Stuff").Value };

        foreach (var item in query)
        {
            Console.WriteLine("Stuff: {0}", item.Stuff);
        }
    }
}
0 голосов
/ 19 февраля 2009

Существует неявное преобразование из System.String в XName, поэтому более обычной формой является

...doc.Descendants("Item")

и

...node.Element("Stuff").Value

Кроме того, я предлагаю doc.Root.Descendants (), как и в предыдущем ответе. Документ все еще находится на «вершине» иерархии, когда он загружен. У меня сложилось впечатление, что Descendants () был рекурсивным, но кто знает, верно?

0 голосов
/ 19 февраля 2009

Попробуйте использовать doc.Root.Decendants ("Item")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...