как получить индекс виджета и почему он дает только первое значение - PullRequest
2 голосов
/ 30 ноября 2011

Я использую код ниже

string xml = @"<?xml version='1.0' encoding='UTF-8'?>
<widgets>
    <widget>
        <url>~/Portal/Widgets/ServicesList.ascx</url>
        <castAs>ServicesWidget</castAs>
        <urlType>ascx</urlType>
        <parameters>
            <PortalCategoryId>3</PortalCategoryId>
        </parameters>
    </widget>
    <widget>
        <url>www.omegacoder.com</url>
        <castAs>ServicesWidget</castAs>
        <urlType>htm</urlType>
        <parameters>
            <PortalCategoryId>41</PortalCategoryId>
        </parameters>
    </widget>
</widgets>";

XDocument loaded = XDocument.Parse( xml );

var widgets = from x in loaded.Descendants( "widget" )
              select new
              {
                  URL = x.Descendants( "url" ).First().Value,
                  Category = x.Descendants( "PortalCategoryId" ).First().Value
              };

foreach ( var wd in widgets )
    Console.WriteLine( "Widget at ({0}) has a category of {1}", wd.URL, wd.Category );

Это дает мне URL и категорию только для первого виджета?Не уверен, как я могу получить значения для второго.Также, как я могу получить индекс виджета, например, 0 и 1 и т. Д. В зависимости от того, сколько есть виджетов.

1 Ответ

2 голосов
/ 30 ноября 2011

Ваш запрос возвращает записи для обоих виджетов. Я попробовал ваш код без изменений.

Следующий запрос поможет вам также получить индекс для каждого виджета:

var widgets = loaded.Descendants("widget").Select((w, i) =>
                   new
                   {        
                     WidgetIndex = i,
                     URL = w.Descendants( "url" )
                            .FirstOrDefault()
                            .Value,
                     Category = w.Descendants("PortalCategoryId")
                                 .FirstOrDefault()
                                 .Value
                   });

Строковое представление:

string widgetsInfo = 
    loaded.Descendants("widget")
          .Select((w, i) =>
                new
                    {
                        WidgetIndex = i,
                        URL = w.Descendants("url").FirstOrDefault().Value,
                        Category = w.Descendants("PortalCategoryId").FirstOrDefault().Value
                    })
            .Select(w => String.Format("Index:{0}; URL:{1}; CATEGORY:{2}; ",
                                        w.WidgetIndex, w.URL, w.Category))
            .Aggregate((acc, next) => acc + Environment.NewLine + next);
...