Выберите узлы Linq to Xml C # - PullRequest
6 голосов
/ 06 августа 2011

Формат файла 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);
 }

Ответы [ 3 ]

12 голосов
/ 06 августа 2011

Я подозреваю, что проблема в том, что вы переходите от 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);
    }
}
3 голосов
/ 06 августа 2011
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"));
1 голос
/ 06 августа 2011

Попробуйте это:

var query = for x in xDoc.Descendants("url")
            select (string)x.Element("loc");

foreach (string loc in query)
{
    urlList.Add(loc);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...