代码之家  ›  专栏  ›  技术社区  ›  BC.

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

  •  0
  • BC.  · 技术社区  · 16 年前

    我不熟悉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.Descendants(xname.get(“item”))返回空值。我在这里的理解有问题。

    3 回复  |  直到 16 年前
        1
  •  1
  •   casperOne    16 年前

    您的代码实际上有效:

    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);
            }
        }
    }
    
        2
  •  0
  •   palehorse    16 年前

    尝试使用doc.root.decendants(“item”)。

        3
  •  0
  •   mqp    16 年前

    有一个从system.string到xname的隐式转换,所以更常见的形式是

    ...doc.Descendants("Item")
    

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

    除此之外,我建议使用doc.root.descendants(),就像前面的答案一样。加载文档时,它仍然位于层次结构的“顶部”。我觉得Descendants()是递归的,但谁知道呢?