【问题标题】:Group a XElement into a collection in Linq to XML?将 XElement 分组到 Linq to XML 中的集合中?
【发布时间】:2011-08-24 07:13:29
【问题描述】:

这是一个 XML 示例:

<ProblemFactory Name="Diagnostic exam" Count="1">
    <Condition ObjectiveID="1" Type="1" CountRanges="2" Range1Decimals="0" Range1Min="3" Range1Max="10" Range2Decimals="0" Range2Min="6" Range2Max="10" />
    <Condition ObjectiveID="1" Type="1" CountRanges="2" Range1Decimals="0" Range1Min="6" Range1Max="10" Range2Decimals="0" Range2Min="6" Range2Max="10" />
</ProblemFactory>

我正在尝试执行以下操作:

        XDocument xdoc = XDocument.Load("ProblemFactory.xml");
        var problems = from pf in xdoc.Descendants("Condition")
                       select new
                       {
                           // ObjectiveID property
                           // Type property
                           // Ranges collection property
                       };

创建范围集合是我的问题。如何构建我的 XML 文件或查询来创建集合?该集合将包含:RangeDecimals、RangeMin、RangeMax。

我不确定,但我可以想象要解决这个问题,我必须重新构造我的 Condition 元组:

<Condition ObjectiveID="1" Type="1" >
    <RangesCollection>
        <Range RangeDecimals="0" RangeMin="3" RangeMax="10" />
        <Range RangeDecimals="0" RangeMin="6" RangeMax="10" />
    </RangesCollection>
</Condition>

【问题讨论】:

  • 虽然可以按照您的要求进行操作(Jimmy 的回答),但我强烈建议您按照您提到的方式更改 XML 的结构。
  • 你绝对应该重新调整你的条件以使用你最终拥有的东西。特别是因为范围的计数可能会有所不同。虽然你真的根本不需要CountRanges
  • 哦,那是真的。我可以从收藏中得到它

标签: c# xml linq-to-xml


【解决方案1】:
var problems = 
    from condition in xdoc.Descendants("Condition")
    select new {
        ObjectiveID = condition.Attribute("ObjectiveID").Value,
        Type = condition.Attribute("Type").Value,
        Ranges = Enumerable
            .Range(1, (int)condition.Attribute("CountRanges"))
            .Select(i => new {
                Min = (int)condition.Attribute("Range" + i + "Min"),
                Max = (int)condition.Attribute("Range" + i + "Max"),
                Decimals = (int)condition.Attribute("Range" + i + "Decimals"),
            }).ToArray()
    };


有了新的格式,
Ranges = condition.Descendants("Range")
    .Select(range => new {
        Min = (int)range.Attribute("RangeMin"),
        Max = (int)range.Attribute("RangeMax"),
        Decimals = (int)range.Attribute("RangeDecimals")
    })
    .ToArray()

【讨论】:

  • 吉米,我喜欢你的解决方案。您认为您可以帮助我使用我发布的新结构转换此代码吗?
  • 对于 LINQ to XML 查询,通常最好对类型进行显式转换,而不是像那样解析它。都是内置的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多