public void NewObject() { Stopwatch watch = new Stopwatch(); watch.Start(); AntlrInputStream input = new AntlrInputStream("regex('//',1)"); ModifyScriptLexer lexer = new ModifyScriptLexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); for (int i = 0; i < 10000; ++i) { lexer.Reset(); tokens.Reset(); ModifyScriptVisitor tableColumnVisitor = new ModifyScriptVisitor(""); ModifyScriptParser parser = new ModifyScriptParser(tokens); tableColumnVisitor.Visit(parser.expr()); } watch.Stop(); long time1 = watch.ElapsedMilliseconds; Stopwatch watch1 = new Stopwatch(); watch.Start(); for (int i = 0; i < 10000; ++i) { AntlrInputStream input1 = new AntlrInputStream("regex('//',1)"); ModifyScriptLexer lexer1 = new ModifyScriptLexer(input1); CommonTokenStream tokens1 = new CommonTokenStream(lexer1); ModifyScriptVisitor tableColumnVisitor = new ModifyScriptVisitor(""); ModifyScriptParser parser1 = new ModifyScriptParser(tokens1); tableColumnVisitor.Visit(parser1.expr()); } watch1.Stop(); long time2 = watch.ElapsedMilliseconds; Assert.IsTrue(time1 < time2); }
private object ProcessSingle(Page page, string html, bool isRaw) { object o = null; try { o = Activator.CreateInstance(_modelType); foreach (FieldExtractor fieldExtractor in _fieldExtractors) { if (fieldExtractor.Multi) { IList <string> value = null; switch (fieldExtractor.Source) { case ExtractSource.RawHtml: value = page.GetHtml().SelectDocumentForList(fieldExtractor.Selector); break; case ExtractSource.Html: value = isRaw ? page.GetHtml().SelectDocumentForList(fieldExtractor.Selector) : fieldExtractor.Selector.SelectList(html); break; case ExtractSource.Url: value = fieldExtractor.Selector.SelectList(page.GetUrl().ToString()); break; case ExtractSource.Enviroment: { EnviromentSelector selector = fieldExtractor.Selector as EnviromentSelector; if (selector != null) { value = selector.GetValueList(page); } break; } default: value = fieldExtractor.Selector.SelectList(html); break; } if ((value == null || value.Count == 0) && fieldExtractor.NotNull) { return(null); } if (fieldExtractor.ObjectFormatter != null) { if (!string.IsNullOrEmpty(fieldExtractor.Expresion)) { MemoryStream stream = new MemoryStream(); StreamWriter writer = new StreamWriter(stream); writer.Write(fieldExtractor.Expresion); writer.Flush(); // convert stream to string stream.Position = 0; AntlrInputStream input = new AntlrInputStream(stream); ModifyScriptLexer lexer = new ModifyScriptLexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); // implement custom expresion IList <string> tmp = new List <string>(); // ReSharper disable once PossibleNullReferenceException foreach (string d in value) { lexer.Reset(); tokens.Reset(); ModifyScriptVisitor modifyScriptVisitor = new ModifyScriptVisitor(d); ModifyScriptParser parser = new ModifyScriptParser(tokens); modifyScriptVisitor.Visit(parser.expr()); if (!string.IsNullOrEmpty(modifyScriptVisitor.Value)) { tmp.Add(modifyScriptVisitor.Value); } } value = tmp; } IList <dynamic> converted = Convert(value, fieldExtractor.ObjectFormatter); dynamic field = fieldExtractor.Field.GetValue(o) ?? Activator.CreateInstance(fieldExtractor.Field.PropertyType); Type[] genericType = fieldExtractor.Field.PropertyType.GetGenericArguments(); MethodInfo method = fieldExtractor.Field.PropertyType.GetMethod("Add", genericType); foreach (var v in converted) { method.Invoke(field, new object[] { v }); } fieldExtractor.Field.SetValue(o, field); } else { fieldExtractor.Field.SetValue(o, value); } } else { string value = null; switch (fieldExtractor.Source) { case ExtractSource.RawHtml: value = page.GetHtml().SelectDocument(fieldExtractor.Selector); break; case ExtractSource.Html: value = isRaw ? page.GetHtml().SelectDocument(fieldExtractor.Selector) : fieldExtractor.Selector.Select(html); break; case ExtractSource.Url: value = fieldExtractor.Selector.Select(page.GetUrl().ToString()); break; case ExtractSource.Enviroment: { EnviromentSelector selector = fieldExtractor.Selector as EnviromentSelector; if (selector != null) { value = selector.GetValue(page)?.ToString(); if (string.IsNullOrEmpty(value)) { } } break; } default: value = fieldExtractor.Selector.Select(html); break; } if (value == null && fieldExtractor.NotNull) { return(null); } if (fieldExtractor.ObjectFormatter != null) { if (!string.IsNullOrEmpty(fieldExtractor.Expresion)) { MemoryStream stream = new MemoryStream(); StreamWriter writer = new StreamWriter(stream); writer.Write(fieldExtractor.Expresion); writer.Flush(); // convert stream to string stream.Position = 0; AntlrInputStream input = new AntlrInputStream(stream); ModifyScriptLexer lexer = new ModifyScriptLexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); ModifyScriptVisitor modifyScriptVisitor = new ModifyScriptVisitor(value); ModifyScriptParser parser = new ModifyScriptParser(tokens); modifyScriptVisitor.Visit(parser.expr()); value = modifyScriptVisitor.Value; } dynamic converted = Convert(value, fieldExtractor.ObjectFormatter); if (converted == null && fieldExtractor.NotNull) { return(null); } fieldExtractor.Field.SetValue(o, converted); } else { fieldExtractor.Field.SetValue(o, value); } } } IAfterExtractor afterExtractor = o as IAfterExtractor; afterExtractor?.AfterProcess(page); } catch (Exception e) { Logger.Error("extract fail", e); } return(o); }