0

我是 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。我在这里的理解有问题。

4

3 回答 3

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);
        }
    }
}
于 2009-02-19T18:39:20.950 回答
0

尝试使用 doc.Root.Decendants("Item")

于 2009-02-19T18:37:30.080 回答
0

有一个从 System.String 到 XName 的隐式转换,所以更常用的形式是

...doc.Descendants("Item")

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

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

于 2009-02-19T18:37:49.813 回答