Нужна помощь с группировкой LinqToXml - PullRequest
0 голосов
/ 03 августа 2011

У меня есть XML-файл, который я пытаюсь сгруппировать по атрибуту «Ширина».Вот фрагмент кода:

<nodes>
<FieldType Name="1000" OriginalName="1000" ScriptName="" SqlType="12" Width="1000" EnableValues="0" Scale="0" ForceMatch="0" ForceMatchCaseSensitive="0" SortAlphabetically="0" />
<FieldType Name="Varchar 1000" OriginalName="Varchar1000" ScriptName="" SqlType="12" Width="1000" EnableValues="0" Scale="0" ForceMatch="0" ForceMatchCaseSensitive="0" SortAlphabetically="0" />
<FieldType Name="Varchar 10001" OriginalName="Varchar1000" ScriptName="" SqlType="12" Width="1000" EnableValues="0" Scale="0" ForceMatch="0" ForceMatchCaseSensitive="0" SortAlphabetically="0" />
<FieldType Name="2000" OriginalName="1000" ScriptName="" SqlType="12" Width="200" EnableValues="0" Scale="0" ForceMatch="0" ForceMatchCaseSensitive="0" SortAlphabetically="0" />
<FieldType Name="Varchar 200" OriginalName="Varchar1000" ScriptName="" SqlType="12" Width="200" EnableValues="0" Scale="0" ForceMatch="0" ForceMatchCaseSensitive="0" SortAlphabetically="0" />
<FieldType Name="Varchar 2001" OriginalName="Varchar1000" ScriptName="" SqlType="12" Width="200" EnableValues="0" Scale="0" ForceMatch="0" ForceMatchCaseSensitive="0" SortAlphabetically="0" />
<FieldType Name="Y/N" ScriptName="" SqlType="12" Width="1" EnableValues="1" ForceMatch="1" Scale="0" ForceMatchCaseSensitive="0" SortAlphabetically="0" />

Я хочу, чтобы мой анализ возвращал 2 значения, 1000 и 2000, так как я хочу уникальную ширину.Код, который я написал:

            XDocument xmlDoc = XDocument.Load(@"c:\temp\sample.xml");
        var q = from c in xmlDoc.Descendants("FieldType")
                group xmlDoc by c.Attribute("Width") into cust_widths
                select new
                {
                    key = cust_widths.Key,
                    value = from val in cust_widths.Elements("Width") select (string)val
                };

        foreach (var name in q)
        {
            System.Diagnostics.Debug.WriteLine(name);
        }

Но это все равно возвращает: 1000, 1000, 1000, 200, 200, 200.

Есть идеи, что не так с моим синтаксисом?

Ответы [ 2 ]

4 голосов
/ 03 августа 2011

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

XDocument xmlDoc = XDocument.Load(@"c:\temp\sample.xml");
var q = 
    from c in xmlDoc.Descendants("FieldType")
    group c by c.Attribute("Width").Value into cust_widths
    select cust_widths.Key;

foreach (var name in q)
{
    System.Diagnostics.Debug.WriteLine(name);
}

Ваш код имел несколько проблем:

  1. Вы группировали весь xmlDoc в группы вместо просто элементов FieldType.
  2. Вы группировали по XAttribute объектам, а не по значениям атрибутов.

На самом деле есть еще более простая версия запроса:

var q = xmlDoc
    .Descendants("FieldType")
    .Select(c => c.Attribute("Width").Value)
    .Distinct();
1 голос
/ 03 августа 2011

Поскольку вы группируете по объекту XAttribute, возвращенному оператором Attribute(), вы получаете уникальные групповые ключи для каждого отдельного элемента. Вам необходимо использовать свойство Value возвращаемого атрибута для группировки по значению атрибута.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...