/// <summary> /// 创建带范畴限定的选择器 /// </summary> /// <param name="expression">选择器表达式</param> /// <param name="scope">范畴限定,上溯时不超出此范畴</param> /// <returns>带范畴限定的层叠选择器</returns> public static ISelector Create(IHtmlContainer scope, string expression) { if (scope == null) { throw new ArgumentNullException("scope"); } if (expression == null) { throw new ArgumentNullException("expression"); } return(CssCasecadingSelector.Create(new CssAncetorRelativeSelector(new ContainerRestrict(scope)), CssParser.ParseSelector(expression))); }
/// <summary> /// 在元素集所有子代元素中使用 CSS 选择器选出符合要求的元素 /// </summary> /// <param name="elements">作为选择范围的元素集</param> /// <param name="expression">CSS 选择器表达式</param> /// <returns>符合选择器的所有子代</returns> public static IEnumerable <IHtmlElement> Find(this IEnumerable <IHtmlElement> elements, string expression) { if (!elements.Any()) { return(Enumerable.Empty <IHtmlElement>()); } if (elements.IsSingle()) { return(elements.Single().Find(expression)); } var document = elements.First().Document; if (elements.Any(e => !e.Document.Equals(document))) { throw new InvalidOperationException("不支持在不同的文档中搜索"); } var selector = CssCasecadingSelector.Create(elements, expression); return(selector.Filter(document.Descendants())); }
/// <summary> /// 创建层叠选择器 /// </summary> /// <param name="leftSelector">左选择器</param> /// <param name="combanitor">结合符</param> /// <param name="rightSelector">右选择器</param> /// <returns>层叠选择器</returns> private static ISelector CreateCasecadingSelector(ISelector leftSelector, char combanitor, CssElementSelector rightSelector) { return(CssCasecadingSelector.Create(leftSelector, combanitor, rightSelector)); }
public static ISelector Combine(CssRelativeSelector relativeSelector, CssMultipleSelector multipleSelector) { return(new CssMultipleSelector(multipleSelector._selectors.Select(selector => CssCasecadingSelector.Create(relativeSelector, selector)).ToArray())); }