private static List<DmxRange> ParseDmxRange(XElement source, ConditionalDmxRangeSet rangeSet, IParseResult result)
        {
            List<DmxRange> dmxRanges = new List<DmxRange>();

            var rangeElements = source.Elements("DmxRange");

            if (rangeElements.Any())
            {
                foreach (var rangeElement in rangeElements)
                {
                    var range = new DmxRange();

                    ParseResult error = new ParseResult(rangeElement.Name.LocalName);
                    string val;

                    TryExecute(
                        () =>
                        {
                            val = ParseAttribute<string>(rangeElement, "Range");
                            Validate(() => Validator.HasValue(val));
                            Validate(() => Validator.IsMatch("\\d+.{3}\\d+", val));
                            range.Range = ParseRangeValue(val);
                        }, "Range", error);

                    TryExecute(
                        () =>
                        {
                            if (rangeElement.HaveElement("DmxRangeLabel"))
                            {
                                range.RangeLabel = rangeElement.GetElementValue("DmxRangeLabel");
                            }
                        }, "DmxRangeLabel", error);

                    TryExecute(
                        () =>
                        {
                            range.FeatureRange = ParseFeatureRange(rangeElement, error);
                        }, "FeatureRange", error);

                    range.ConditionalRangeSet = rangeSet;

                    if (error.FieldsWithError.Count == 0)
                        dmxRanges.Add(range);

                    if (error.HaveError) result.ErrorList.Add(error);
                }
            }

            return dmxRanges;
        }
        private static Dictionary<ConditionalDmxRangeSet, List<DmxRange>> ParseConditionalDmxRangeSet(XElement source, IParseResult result)
        {
            Dictionary<ConditionalDmxRangeSet,List<DmxRange>> rangeSets = new Dictionary<ConditionalDmxRangeSet, List<DmxRange>>();

            var rangeSetElements = source.Elements("ConditionalDmxRangeSet");

            if (rangeSetElements.Any())
            {
                string val;
                foreach (XElement rangeSetElement in rangeSetElements)
                {
                    var rangeSet = new ConditionalDmxRangeSet();
                    ParseResult error = new ParseResult(rangeSetElement.Name.LocalName);

                    TryExecute(
                        () =>
                        {
                            rangeSet.RangeSetCondition = ParseDmxRangeSetCondition(rangeSetElement, error).FirstOrDefault();
                        }, "DmxRangeSetCondition", error);

                    if (error.FieldsWithError.Count == 0)
                    {
                        rangeSets[rangeSet] = ParseDmxRange(rangeSetElement, rangeSet, error);
                    }

                    if (error.HaveError) result.ErrorList.Add(error);
                }
            }

            return rangeSets;
        }