Группировать XElement в коллекцию в Linq для XML? - PullRequest
0 голосов
/ 24 августа 2011

Это пример 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>

1 Ответ

3 голосов
/ 24 августа 2011
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()
...