Я подозреваю, что проблема в том, что вы переходите от document.Elements("url")
вместо document.Root.Elements("url")
... поэтому он ищет корневой элемент url
, который не существует.
Попробуйте это:
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);
}
}