2011-08-02 3 views
0

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

<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.

Любая идея, что случилось с моим синтаксисом?

ответ

4

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

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(); 
+0

Человек, я был рядом! Я предполагаю, что добавленная стоимость сделала каждую строку уникальной. Спасибо, мне нравится ваша более простая версия еще лучше, нужно любить linq. –

1

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

+0

Да, я был близок, хорошо поймал! –