我的简单查询有什么问题?

时间:2009-02-19 18:31:42

标签: c# linq-to-xml

我是Linq to 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”))返回null。我的理解在这里出了点问题。

3 个答案:

答案 0 :(得分:1)

您的代码确实有效:

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

答案 1 :(得分:0)

尝试使用doc.Root.Decendants(“Item”)

答案 2 :(得分:0)

从System.String到XName的隐式转换,所以更通常的形式是

...doc.Descendants("Item")

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

除此之外,我建议doc.Root.Descendants()与上一个答案一样。加载时,文档仍位于层次结构的“顶部”。我的印象是Descendants()是递归的,但谁知道呢,对吧?