/// <summary> /// 使用选择器从元素集中筛选出符合选择器要求的元素 /// </summary> /// <param name="source">源元素集</param> /// <param name="selector">选择器</param> /// <returns>筛选结果</returns> public static IEnumerable <IHtmlElement> FilterBy(this IEnumerable <IHtmlElement> source, string selector) { if (source == null) { return(null); } if (string.IsNullOrEmpty(selector)) { return(source); } return(FilterBy(source, CssParser.ParseSelector(selector))); }
/// <summary> /// 派生类重写此方法确定指定元素是否需要重写渲染规则 /// </summary> /// <param name="element">要检测的元素</param> /// <returns>是否需要使用自定义渲染规则</returns> protected virtual bool IsEligible(IHtmlElement element) { if (CssSelector == null) { return(false); } if (_selectorExpression == CssSelector) { return(_selectorCache.IsEligible(element)); } _selectorExpression = CssSelector; _selectorCache = CssParser.ParseSelector(CssSelector); return(_selectorCache.IsEligible(element)); }
/// <summary> /// 创建层叠选择器 /// </summary> /// <param name="elements">作为范畴限定的元素集</param> /// <param name="expression">选择器表达式</param> /// <returns>层叠选择器</returns> public static ISelector Create(IEnumerable <IHtmlElement> elements, string expression) { if (elements == null) { throw new ArgumentNullException("elements"); } if (expression == null) { throw new ArgumentNullException("expression"); } var selector = CssParser.ParseSelector(expression); if (elements.IsNullOrEmpty()) { return(selector); } var relativeSelector = new CssAncetorRelativeSelector(new CssElementsRestrictionSelector(elements)); return(Create(relativeSelector, selector)); }
/// <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> /// 获取符合条件的子代元素 /// </summary> /// <param name="container">要获取子代元素的容器对象</param> /// <param name="selector">用于筛选子代元素的选择器</param> /// <returns>符合选择器的容器的所有子代元素</returns> /// <remarks>与Find方法不同的是,Descendants方法的选择器会无限上溯,即当判断父代约束时,会无限上溯到文档根。而Find方法只会上溯到自身的子节点</remarks> public static IEnumerable <IHtmlElement> Descendants(this IHtmlContainer container, string selector) { return(CssParser.ParseSelector(selector).Filter(Descendants(container))); }