/// <summary> /// Поиск по подготовленному регекс-запросу с парамтерами /// </summary> /// <param name="root"></param> /// <param name="query"></param> /// <returns></returns> public IEnumerable <XElement> Select(XElement root, RegexSelectorQuery query) { if (IsMatch(root, query)) { yield return(root); } foreach (var child in root.Elements()) { foreach (var childresult in Select(child, query)) { yield return(childresult); } } }
/// <summary> /// Проверяет соответствие элемента регекс - запросу /// </summary> /// <param name="root"></param> /// <param name="query"></param> /// <returns></returns> public bool IsMatch(XElement root, RegexSelectorQuery query) { if (null != query.TagFilter && 0 != query.TagFilter.Length) { if (query.UseTagFilterAsExclude) { if (-1 != Array.IndexOf(query.TagFilter, root.Name.LocalName)) { return(false); } } else { if (-1 == Array.IndexOf(query.TagFilter, root.Name.LocalName)) { return(false); } } } if (query.FindInFullString) { if (query.Regex.IsMatch(root.ToString())) { return(true); } } if (query.FindInAttributes) { if (root.Attributes().Any(a => query.Regex.IsMatch(a.Value))) { return(true); } } if (query.FindInTextValues) { if (root.Nodes().OfType <XText>().Any(t => query.Regex.IsMatch(t.Value))) { return(true); } } return(false); }