需要帮助LinqToXml分组

时间:2011-08-02 23:21:11

标签: linq linq-to-xml

我有一个XML文件,我试图通过属性“Width”进行分组。这是一个片段:

<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 个答案:

答案 0 :(得分: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个对象进行分组,而不是按属性'值进行分组。
  3. 实际上有一个更简单的查询版本:

    var q = xmlDoc
        .Descendants("FieldType")
        .Select(c => c.Attribute("Width").Value)
        .Distinct();
    

答案 1 :(得分:1)

由于您按XAttribute运算符返回的Attribute()对象进行分组,因此您将获得每个元素的唯一组键。您需要使用返回属性的Value属性按属性值进行分组。