/// <summary> /// 执行文法解释 /// </summary> /// <param name="context"><see cref="TableDescContext"/>实例</param> public override void Interpret(TableDescContext context) { if (context == null || string.IsNullOrWhiteSpace(context.TableHtml)) { return; } //数据表描述 的匹配正则式 Regex regex = new Regex(@"<(?<HxTag>h\d+)\s+[^>]*id=""表[^>]+>\s*\[表\]\s*(?<desc>[^\((]+)[\((](?<name>[^\))]+)[\))]</\k<HxTag>>", RegexOptions.IgnoreCase | RegexOptions.Compiled); Match match = regex.Match(context.TableHtml); string name = match.Groups["name"].Value; int splitIndex = name.IndexOf("_"); string module = splitIndex > 0 ? name.Substring(0, splitIndex) : name; if (string.IsNullOrWhiteSpace(name)) { name = ConfigurationManager.AppSettings["DefaultModuleName"]; } context.Table.Name = name.Replace("_", ""); //数据表名 context.Table.Description = match.Groups["desc"].Value; //数据表说明 context.Table.Module = module; //所属模块 }
/// <summary> /// 从Html代码中解析出数据表集合 /// </summary> /// <param name="html"></param> /// <returns></returns> public static List <TableDesc> ResolveTables(string html) { if (string.IsNullOrWhiteSpace(html)) { return(null); } List <TableDesc> list = new List <TableDesc>(); #region //获取数据表的匹配集合 Regex regex = new Regex(@"<(?<HxTag>h\d+)\s+[^>]*id=""表[^>]+>((?<Nested><\k<HxTag>[^>]*>)|</\k<HxTag>>(?<-Nested>)|.*?)*</\k<HxTag>>(?<clumns>((?!</table>).|\n)*)", RegexOptions.IgnoreCase | RegexOptions.Compiled); var tableMatchs = regex.Matches(html); #endregion #region //将每个HTML的内容描述转换为TableDesc对象 //循环处理 foreach (Match m in tableMatchs) { //定义数据表描述对象处理上下文 TableDescContext context = new TableDescContext(m.Value); //将HTMl信息解释为数据表TableDesc的解释器 List <TableExpression> exps = new List <TableExpression>(); exps.Add(new TableDescExpression()); //数据表描述信息解释器 exps.Add(new TableColumnsExpression()); //数据表字段解释器 //循环执行文法解释器 foreach (var exp in exps) { exp.Interpret(context); } //将解释出来的TableDesc加入到集合中 list.Add(context.Table); } #endregion return(list); }
/// <summary> /// 执行方法解释 /// </summary> /// <param name="context"><see cref="TableDescContext"/>实例</param> public override void Interpret(TableDescContext context) { if (context == null || string.IsNullOrWhiteSpace(context.TableHtml)) { return; } //数据表字段 的匹配正则式 Regex regex = new Regex(@"<tr>[\r\n\s]*<td>(?<cannullable><strong>)?(?<name>[^<]*)(</strong>)?</td>[\r\n\s]*<td>(?<datatype>[^<]*)</td>[\r\n\s]*<td>(?<defaultvalue>[^<]*)</td>[\r\n\s]*<td>(?<desc>((?!</td>).|\n)*)</td>[\r\n\s]*</tr>", RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Compiled); MatchCollection mc = regex.Matches(context.TableHtml); List <TableColumn> columnList = new List <TableColumn>(); List <string> keys = new List <string>(); //遍历字段处理 foreach (Match m in mc) { //字段名 string name = m.Groups["name"].Value.Trim(); //字段描述 string desc = ResolverDesc(m.Groups["desc"].Value.Trim()); //是否可为空 bool canNullable = string.IsNullOrWhiteSpace(m.Groups["cannullable"].Value); //字段枚举类型 string enumType = ResolverEnumType(desc); //枚举类型 //数据库数据类型 string dbType; //C#中数据类型 string csharpType; //总限制长度 int totalBit; //小数位限制长度 int decimalBit; //解析数据类型 ResolverDataType(m.Groups["datatype"].Value, canNullable, out csharpType, out dbType, out totalBit, out decimalBit); if (!string.IsNullOrWhiteSpace(enumType)) { csharpType = enumType; } TableColumn column = new TableColumn(); column.Name = name; column.DefaultValue = m.Groups["defaultvalue"].Value; column.Description = desc; column.CanNullable = canNullable; column.DataType = csharpType; column.DbType = dbType; column.TotalBit = totalBit; column.DeicmalBit = decimalBit; column.IsPrimaryKey = desc.StartsWith("主键"); column.IsUniquePrimary = false; //是否为唯一主键,默认false columnList.Add(column); //加入到主键集合中 if (column.IsPrimaryKey) { keys.Add(name); } } //处理唯一主键 if (keys.Count == 1) { var item = columnList.FirstOrDefault(p => p.Name.Equals(keys[0])); item.IsUniquePrimary = true; } context.Table.Columns = columnList; }