【问题标题】:Need help with LinqToXml grouping在 LinqToXml 分组方面需要帮助
【发布时间】:2011-08-03 07:32:48
【问题描述】:

我有一个 XML 文件,我正在尝试按属性“宽度”进行分组。这是一个sn-p:

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

知道我的语法有什么问题吗?

【问题讨论】:

    标签: linq linq-to-xml


    【解决方案1】:

    试试这个:

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

    【讨论】:

    • 伙计,我很接近了!我猜想增加的价值使每一行都是独一无二的。谢谢,我更喜欢你更简单的版本,我很喜欢 linq。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-11
      • 2011-08-09
      • 1970-01-01
      • 2021-01-16
      • 2011-01-27
      • 2014-02-06
      • 2017-11-02
      • 1970-01-01
      相关资源
      最近更新 更多