protected virtual string ProcessGetCriterea(XElement xmlParceRule, IDOMElement expectedNode, PostModel postModel, string postfix = null) { string result = null; var getCritereaNode = xmlParceRule.Elements().FirstOrDefault(el => el.Name.ToString().ToLower() == (string.IsNullOrEmpty(postfix) ? GET_CRITEREA_NODE_NAME : GET_CRITEREA_NODE_NAME + postfix).ToLower()); var getCriterea = getCritereaNode.Elements().First(); var getResult = string.Empty; switch (getCriterea.Name.ToString().ToLower()) { case "values": case "childs": case "element": case "content": getResult = expectedNode.GetContent(getCriterea.Name.ToString()); break; default: var expectedNodeContent = expectedNode.GetContent(getCriterea.Name.ToString()); if (!string.IsNullOrEmpty(expectedNodeContent)) { getResult = string.IsNullOrEmpty(getCriterea.Value) ? expectedNodeContent : Regex.Match(expectedNodeContent, getCriterea.Value, RegexOptions.IgnoreCase).Value; } break; } var trimCritereaNode = xmlParceRule.Elements().FirstOrDefault(el => el.Name.ToString().ToLower() == (string.IsNullOrEmpty(postfix) ? TRIM_CRITEREA_NODE_NAME : TRIM_CRITEREA_NODE_NAME + postfix).ToLower()); if (trimCritereaNode != null) { if (trimCritereaNode.Attributes().Any(attr => attr.Name.ToString().ToLower() == STRING_TRIM_ATTRIBUTE_NAME.ToLower() && bool.Parse(attr.Value))) { var splitResult = getResult.Split(trimCritereaNode.Value.Split(new[] { ' ' }), StringSplitOptions.RemoveEmptyEntries); result = trimCritereaNode.Attributes().Any(attr => attr.Name.ToString().ToLower() == GET_LAST_OCCURENCE_ATTRIBUTE_NAME.ToLower() && bool.Parse(attr.Value)) ? splitResult[splitResult.Length - 1] : splitResult[0]; } else if (trimCritereaNode.Attributes().Any(attr => attr.Name.ToString().ToLower() == REG_EXP_TRIM_ATTRIBUTE_NAME.ToLower() && bool.Parse(attr.Value))) { if (trimCritereaNode.Attributes().Any(attr => attr.Name.ToString().ToLower() == GET_LAST_OCCURENCE_ATTRIBUTE_NAME.ToLower() && bool.Parse(attr.Value))) { var regExpMatch = Regex.Matches(getResult, trimCritereaNode.Value, RegexOptions.IgnoreCase); result = regExpMatch[regExpMatch.Count - 1].Value; } else { result = Regex.Match(getResult, trimCritereaNode.Value, RegexOptions.IgnoreCase).Value; } } else if (trimCritereaNode.Attributes().Any(attr => attr.Name.ToString().ToLower() == REMOVE_TRIM_ATTRIBUTE_NAME.ToLower() && bool.Parse(attr.Value))) { result = result.Where(el => !trimCritereaNode.Value.Any(elem => elem == el)).Aggregate(string.Empty, (agg, el) => agg + el); } else { result = getResult.Trim(trimCritereaNode.Value.ToArray()); } var additionalTrimCritereaNode = xmlParceRule.Elements().FirstOrDefault(el => el.Name.ToString().ToLower() == (ADDITIONAL_PREFIX + (string.IsNullOrEmpty(postfix) ? TRIM_CRITEREA_NODE_NAME : TRIM_CRITEREA_NODE_NAME + postfix)).ToLower()); if (additionalTrimCritereaNode != null) { if (additionalTrimCritereaNode.Attributes().Any(attr => attr.Name.ToString().ToLower() == STRING_TRIM_ATTRIBUTE_NAME.ToLower() && bool.Parse(attr.Value))) { var splitResult = getResult.Split(trimCritereaNode.Value.Split(new[] { ' ' }), StringSplitOptions.RemoveEmptyEntries); result = trimCritereaNode.Attributes().Any(attr => attr.Name.ToString().ToLower() == GET_LAST_OCCURENCE_ATTRIBUTE_NAME.ToLower() && bool.Parse(attr.Value)) ? splitResult[splitResult.Length - 1] : splitResult[0]; } else if (additionalTrimCritereaNode.Attributes().Any(attr => attr.Name.ToString().ToLower() == REG_EXP_TRIM_ATTRIBUTE_NAME.ToLower() && bool.Parse(attr.Value))) { if (trimCritereaNode.Attributes().Any(attr => attr.Name.ToString().ToLower() == GET_LAST_OCCURENCE_ATTRIBUTE_NAME.ToLower() && bool.Parse(attr.Value))) { var regExpMatch = Regex.Matches(getResult, trimCritereaNode.Value, RegexOptions.IgnoreCase); result = regExpMatch[regExpMatch.Count - 1].Value; } else { result = Regex.Match(getResult, trimCritereaNode.Value, RegexOptions.IgnoreCase).Value; } } else if (additionalTrimCritereaNode.Attributes().Any(attr => attr.Name.ToString().ToLower() == REMOVE_TRIM_ATTRIBUTE_NAME.ToLower() && bool.Parse(attr.Value))) { result = result.Where(el => !additionalTrimCritereaNode.Value.Any(elem => elem == el)).Aggregate(string.Empty, (agg, el) => agg + el); } else { result = result.Trim(additionalTrimCritereaNode.Value.ToArray()); } } } else { result = getResult; } return(result); }