Esempio n. 1
0
        /// <summary>
        /// 创建选择器
        /// </summary>
        /// <param name="expression">选择器表达式</param>
        /// <returns>选择器实例</returns>
        public static ICssSelector Create(string expression)
        {
            if (selectorCache.ContainsKey(expression))
            {
                return(selectorCache[expression]);
            }

            var match = casecadingSelectorRegex.Match(expression);

            if (!match.Success)
            {
                throw new FormatException();
            }


            ICssSelector selector = CssElementSelector.Create(match.Groups["leftSelector"].Value);

            foreach (var extraCapture in match.Groups["extra"].Captures.Cast <Capture>())
            {
                var relative      = extraCapture.FindCaptures(match.Groups["relative"]).Single().Value.Trim();
                var rightSelector = extraCapture.FindCaptures(match.Groups["rightSelector"]).Single().Value.Trim();

                selector = new CssCasecadingSelector(selector, relative, CssElementSelector.Create(rightSelector));
            }

            lock ( _cacheSync )
            {
                selectorCache[expression] = selector;
            }

            return(selector);
        }
Esempio n. 2
0
        /// <summary>
        /// 获取符合条件的子元素
        /// </summary>
        /// <param name="container">要获取子元素的容器</param>
        /// <param name="selector">用来筛选子元素的元素选择器</param>
        /// <returns>符合条件的子元素</returns>
        public static IEnumerable <IHtmlElement> Elements(this IHtmlContainer container, string selector)
        {
            if (container == null)
            {
                throw new ArgumentNullException("container");
            }

            if (selector == null)
            {
                throw new ArgumentNullException("selector");
            }


            return(CssElementSelector.Create(selector).Filter(Elements(container)));
        }
Esempio n. 3
0
 /// <summary>
 /// 获取符合条件的兄弟(同级)元素节点
 /// </summary>
 /// <param name="node">要获取兄弟(同级)元素节点的节点</param>
 /// <param name="selector">用于筛选元素的元素选择器</param>
 /// <returns>所有的兄弟(同级)元素节点</returns>
 public static IEnumerable <IHtmlElement> Siblings(this IHtmlNode node, string selector)
 {
     return(CssElementSelector.Create(selector).Filter(node.Siblings()));
 }
Esempio n. 4
0
 /// <summary>
 /// 获取符合条件的父代元素
 /// </summary>
 /// <param name="node">要获取父代元素集合的节点</param>
 /// <param name="selector">用来筛选父代元素的元素选择器</param>
 /// <returns>节点的所有父代元素集合</returns>
 public static IEnumerable <IHtmlElement> Ancestors(this IHtmlNode node, string selector)
 {
     return(CssElementSelector.Create(selector).Filter(Ancestors(node)));
 }
Esempio n. 5
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));
 }
Esempio n. 6
0
 /// <summary>
 /// 调用此方法预热选择器
 /// </summary>
 public static void WarmUp()
 {
     casecadingSelectorRegex.IsMatch("");
     CssElementSelector.WarmUp();
 }
Esempio n. 7
0
 /// <summary>
 /// 构建 NegationPseudoClass 对象
 /// </summary>
 /// <param name="elementSelector">元素选择器</param>
 public NegationPseudoClass(CssElementSelector elementSelector)
 {
     _elementSelector = elementSelector;
 }
Esempio n. 8
0
 /// <summary>
 /// 构建 NegationPseudoClass 对象
 /// </summary>
 /// <param name="elementSelector">元素选择器</param>
 public NegationPseudoClass( CssElementSelector elementSelector )
 {
   _elementSelector = elementSelector;
 }