Esempio n. 1
0
        /// <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)));
        }
Esempio n. 2
0
        /// <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()));
        }
Esempio n. 3
0
 /// <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()));
 }