听起来您正在尝试实现自动化;对我来说,这建议寻找最可靠的解决方案,否则自动化并不值得,因为您将不得不假设它的任何部分都可能失败。
我可以想到几种方法来解决这个问题:
1 -
正则表达式 只要您不试图将整个事情变成结构完美的结果,正则表达式就可以正常工作。虽然典型的 ASCX 比纯 HTML 更结构化(否则它不会运行),但它仍然有可能出现格式错误。因此,它遭受了常见的 HTML 解析缺陷。
2 - 解析器
一个简单的状态机解析器可以帮助您识别特定的控件并解决正则表达式无法处理的场景。这可以像您想要的那样简单或复杂。高级解析器可以构建整个层次结构;一个简单的解析器可能只检索所有控件,可能还有内联代码块 (<%= %>) 和数据绑定信息。
3 - 使用已编译的程序集
您可能知道,ASP.Net 应用程序从标记转换为 c# 类,然后再转换为程序集。这些程序集在%System%\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files
目录中可用。虽然它们的名字并不好(因为它们不适合直接使用),但它们确实包含了 .Net 如何查看页面/控件的极其准确的表示。您可以使用反射来访问这些数据。
其中一个文件的内容包含以下数据,例如 a 的声明ValidationSummary
:
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
private global::System.Web.UI.WebControls.ValidationSummary @__BuildControlvs() {
global::System.Web.UI.WebControls.ValidationSummary @__ctrl;
#line 6 "C:\Development\VS 2010\..."
@__ctrl = new global::System.Web.UI.WebControls.ValidationSummary();
#line default
#line hidden
this.vs = @__ctrl;
@__ctrl.TemplateControl = this;
@__ctrl.ApplyStyleSheetSkin(this.Page);
#line 6 "C:\Development\VS 2010\..."
@__ctrl.ID = "vs";
#line default
#line hidden
#line 6 "C:\Development\VS 2010\..."
@__ctrl.ValidationGroup = "Group1";
return @__ctrl;
}
如您所见,这些类包含页面或控件的完整数据。它们还包含原始代码的行号和文件名(可能对您有用)。
概括
选项 #1 对于简单场景来说是最快的。选项 #3 非常强大,但与应用程序的物理基础架构紧密耦合,并且与自动生成代码的结构方式有些耦合。选项 #2 将需要最多的工作。
最后,可能有一种方法可以以编程方式访问 markup-to-c# 转换器并自己编译程序集(就像第一次访问应用程序时所做的那样 - 类似于选项 #3)。