/// <summary> /// 从html中寻找数据 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="htmlDocument"></param> /// <returns></returns> public static T FindDataByXPath <T>(HtmlDocument htmlDocument) { HtmlNode htmlNode = htmlDocument.DocumentNode; Type type = typeof(T); object obj = type.GetConstructor(Type.EmptyTypes).Invoke(null); FindDataConvertAttr findDataConvertAttr = (FindDataConvertAttr)type.GetCustomAttribute(typeof(FindDataConvertAttr)); FindDataConvert findDataConvert = (FindDataConvert)findDataConvertAttr.Type.GetConstructor(Type.EmptyTypes).Invoke(null); foreach (PropertyInfo propertyInfo in type.GetProperties()) { foreach (Attribute attr in propertyInfo.GetCustomAttributes(false)) { if (attr.GetType() == typeof(FindDataAttr)) { FindDataAttr findDataAttr = (FindDataAttr)attr; if (findDataAttr.RuleEnum == RuleEnum.XPath) { HtmlNode node = FindDataByXPath(htmlNode, findDataAttr.RuleArray); dynamic convertAfter; if (findDataConvert.ConvertTo(propertyInfo.Name, node, out convertAfter)) { propertyInfo.SetValue(obj, convertAfter); } else { propertyInfo.SetValue(obj, findDataAttr.DefaultVal); } continue; } } } } return((T)obj); }
/// <summary> /// 从json对象寻找数据 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="jobject"></param> /// <returns></returns> public static T FindDataByJsonPath <T>(JObject jobject) { Type type = typeof(T); object obj = type.GetConstructor(Type.EmptyTypes).Invoke(null); FindDataConvertAttr findDataConvertAttr = (FindDataConvertAttr)type.GetCustomAttribute(typeof(FindDataConvertAttr)); FindDataConvert findDataConvert = (FindDataConvert)findDataConvertAttr.Type.GetConstructor(Type.EmptyTypes).Invoke(null); foreach (PropertyInfo propertyInfo in type.GetProperties()) { foreach (Attribute attr in propertyInfo.GetCustomAttributes(false)) { if (attr.GetType() == typeof(FindDataAttr)) { FindDataAttr findDataAttr = (FindDataAttr)attr; if (findDataAttr.RuleEnum == RuleEnum.JsonPath) { JToken token = FindDataByJsonPath(jobject, findDataAttr.RuleArray); dynamic convertAfter; if (findDataConvert.ConvertTo(propertyInfo.Name, token, out convertAfter)) { propertyInfo.SetValue(obj, convertAfter); } else { propertyInfo.SetValue(obj, findDataAttr.DefaultVal); } continue; } } } } return((T)obj); }
/// <summary> /// 从文本中寻找数据 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="text"></param> /// <returns></returns> public static T FindDataByPrefixAndSuffix <T>(string text) { Type type = typeof(T); object obj = type.GetConstructor(Type.EmptyTypes).Invoke(null); FindDataConvert findDataConvert = null; if (type.IsDefined(typeof(FindDataConvertAttr), false)) { FindDataConvertAttr findDataConvertAttr = (FindDataConvertAttr)type.GetCustomAttribute(typeof(FindDataConvertAttr)); findDataConvert = (FindDataConvert)findDataConvertAttr.Type.GetConstructor(Type.EmptyTypes).Invoke(null); } foreach (PropertyInfo propertyInfo in type.GetProperties()) { foreach (Attribute attr in propertyInfo.GetCustomAttributes(false)) { if (attr.GetType() == typeof(FindDataAttr)) { FindDataAttr findDataAttr = (FindDataAttr)attr; if (findDataAttr.RuleEnum == RuleEnum.PrefixSuffix) { string dataStr = FindDataByPrefixAndSuffix(text, findDataAttr.RuleArray); dynamic convertAfter; if (findDataConvert != null && findDataConvert.ConvertTo(propertyInfo.Name, dataStr, out convertAfter)) { propertyInfo.SetValue(obj, convertAfter); } else { propertyInfo.SetValue(obj, string.IsNullOrEmpty(dataStr) || string.IsNullOrEmpty(dataStr.Trim()) ? findDataAttr.DefaultVal : dataStr); } continue; } } } } return((T)obj); }