コード例 #1
0
 private static void NotNullExpression(Attribute.Selector selector)
 {
     if (string.IsNullOrWhiteSpace(selector.Expression))
     {
         throw new ArgumentException($"Expression of {selector} should not be null/empty");
     }
 }
コード例 #2
0
ファイル: Model.cs プロジェクト: tmxk505/DotnetSpider
        /// <summary>
        /// 构造方法
        /// </summary>
        public Model()
        {
            var type = typeof(T);

            TypeName = type.FullName;
            var entitySelector =
                type.GetCustomAttributes(typeof(EntitySelector), true).FirstOrDefault() as EntitySelector;
            int  take         = 0;
            bool takeFromHead = true;

            Attribute.Selector selector = null;
            if (entitySelector != null)
            {
                take         = entitySelector.Take;
                takeFromHead = entitySelector.TakeFromHead;
                selector     = new Attribute.Selector {
                    Expression = entitySelector.Expression, Type = entitySelector.Type
                };
            }

            var followSelectors = type.GetCustomAttributes(typeof(FollowSelector), true).Select(x => (FollowSelector)x)
                                  .ToList();
            var sharedValueSelectors = type.GetCustomAttributes(typeof(ValueSelector), true)
                                       .Select(x => (ValueSelector)x).ToList();

            var properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);

            var valueSelectors = new HashSet <ValueSelector>();

            foreach (var property in properties)
            {
                var valueSelector = property.GetCustomAttributes(typeof(ValueSelector), true).FirstOrDefault() as ValueSelector;

                if (valueSelector == null)
                {
                    continue;
                }

                if (string.IsNullOrWhiteSpace(valueSelector.Name))
                {
                    valueSelector.Name = property.Name;
                }

                valueSelector.Formatters = property.GetCustomAttributes(typeof(Formatter.Formatter), true)
                                           .Select(p => (Formatter.Formatter)p).ToArray();
                valueSelector.PropertyInfo = property;
                valueSelector.NotNull      = property.GetCustomAttributes(typeof(Required), false).Any();
                valueSelectors.Add(valueSelector);
            }

            Selector            = selector;
            ValueSelectors      = valueSelectors;
            FollowSelectors     = new HashSet <FollowSelector>(followSelectors);
            ShareValueSelectors = new HashSet <ValueSelector>(sharedValueSelectors);
            Take         = take;
            TakeFromHead = takeFromHead;
        }
コード例 #3
0
        /// <summary>
        /// 把 BaseSelector 转换成真正的查询器
        /// </summary>
        /// <param name="selector">BaseSelector</param>
        /// <returns>查询器</returns>
        public static ISelector ToSelector(this Attribute.Selector selector)
        {
            if (selector != null)
            {
                var expression = selector.Expression;

                switch (selector.Type)
                {
                case SelectorType.Css:
                {
                    NotNullExpression(selector);
                    return(Selectors.Css(expression));
                }

                case SelectorType.JsonPath:
                {
                    NotNullExpression(selector);
                    return(Selectors.JsonPath(expression));
                }

                case SelectorType.Regex:
                {
                    NotNullExpression(selector);
                    if (string.IsNullOrEmpty(selector.Arguments))
                    {
                        return(Selectors.Regex(expression));
                    }

                    if (int.TryParse(selector.Arguments, out var group))
                    {
                        return(Selectors.Regex(expression, group));
                    }
                    throw new ArgumentException($"Regex argument should be a number set to group: {selector}");
                }

                case SelectorType.XPath:
                {
                    NotNullExpression(selector);
                    return(Selectors.XPath(expression));
                }

                default:
                {
                    throw new NotSupportedException($"{selector} unsupported");
                }
                }
            }

            return(null);
        }