【问题标题】:Select nodes Linq to Xml C#选择节点 Linq to Xml C#
【发布时间】:2011-08-06 09:00:42
【问题描述】:

XML 文件格式:

<?xml version="1.0" encoding="UTF-8"?>
    <urlset>    
        <url>
            <loc>element1</loc>
            <changefreq>daily</changefreq>
            <priority>0.2</priority>
        </url>
        <url>
            <loc>element2</loc>
            <changefreq>daily</changefreq>
            <priority>0.2</priority>
        </url>
    <urlset>

我想选择所有“loc”节点(element1,element2),但这不起作用!!!

 foreach (XElement item in document.Elements("url").Descendants("loc")) // Change into what?
 {
      urlList.Add(item.Value);
 }

【问题讨论】:

    标签: c# xml linq linq-to-xml


    【解决方案1】:

    我怀疑问题在于您要从document.Elements("url") 而不是document.Root.Elements("url")...所以它正在寻找urlroot 元素,它不存在。

    试试这个:

    List<string> urlList = doc.Root.Elements("url")
                                   .Elements("loc")
                                   .Select(x => (string) x)
                                   .ToList();
    

    请注意,我在这里没有使用Descendants,因为loc 元素都在url 元素的正下方。

    如果 only loc 元素无论如何都是正确的,您可以使用的另一种选择是:

    List<string> urlList = doc.Descendants("loc")
                              .Select(x => (string) x)
                              .ToList();
    

    (我假设 urlList 事先是空的……对于这种情况,我喜欢在整个操作中使用 LINQ 并消除刚刚添加到集合中的 foreach 循环。)

    编辑:代码对我有用。这是一个简短但完整的程序:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Xml.Linq;
    
    class Test
    {
        static void Main(string[] args)
        {
            string xml = @"<?xml version=""1.0"" encoding=""UTF-8""?>
        <urlset>    
            <url>
                <loc>element1</loc>
                <changefreq>daily</changefreq>
                <priority>0.2</priority>
            </url>
            <url>
                <loc>element2</loc>
                <changefreq>daily</changefreq>
                <priority>0.2</priority>
            </url>
        </urlset>";
    
            XDocument doc = XDocument.Parse(xml);
            List<string> urlList = doc.Root
                                      .Elements("url")
                                      .Elements("loc")
                                      .Select(x => (string) x)
                                      .ToList();
            Console.WriteLine(urlList.Count);
        }
    }
    

    【讨论】:

    • 嗨乔恩!我使用了你的代码,但我的 urlList 仍然是空的! :((我从字符串中解析 xml)。
    • @Chelsea_cole:对我有用——我已经发布了一个完整的程序来展示它的工作原理。请注意,我必须修复您的原始 XML,从末尾的 &lt;urlset&gt;&lt;/urlset&gt;。请试试我的代码,然后看看它和你尝试的有什么区别......
    • 您的代码确实有效!但仍然不适合我 :( 也许是因为我的 streamreader 字符串?) StreamReader streamReader = new StreamReader(@"D:\data.xml");字符串文本 = streamReader.ReadToEnd(); streamReader.Close(); XDocument doc = XDocument.Parse(text);
    • 这更有可能是因为您的 XML 与您发布的内容不同。但无论如何,像这样解析 XML 并不是一个好主意:它假设 UTF-8,而 XDocument 可以为多种编码做正确的事情;您应该使用 using 语句而不是显式关闭;要阅读整个文件,您可以使用File.ReadAllText;无论如何,您都可以使用XDocument.Load(string) 完成所有这些操作。
    • @CJohnson:我建议您提出一个新问题,并提供一个简短但完整的示例来说明您当时正在尝试做什么。仅从您的评论中无法判断出问题所在。
    【解决方案2】:
    var xDoc = XDocument.Parse(
        @"<urlset>    
            <url>
                <loc>element1</loc>
                <changefreq>daily</changefreq>
                <priority>0.2</priority>
            </url>
            <url>
                <loc>element2</loc>
                <changefreq>daily</changefreq>
                <priority>0.2</priority>
            </url>
        </urlset>");
    var locElements = xDoc.Descendants("url").SelectMany(el => el.Descendants("loc"));
    

    【讨论】:

    • 这将返回一个IEnumerable&lt;IEnumerable&lt;XElement&gt;&gt;,我认为这不是我们想要的......
    • Descendants() 的工作方式,没有必要使用SelectMany - 有一个以IEnumerable&lt;XElement&gt; 开头的重载开始
    【解决方案3】:

    试试这个:

    var query = for x in xDoc.Descendants("url")
                select (string)x.Element("loc");
    
    foreach (string loc in query)
    {
        urlList.Add(loc);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多