给定一个aspx文件,我想解析它的控件。我看到了关于相同主题的其他帖子,但它并不真正符合我的需求。
示例:
<Ctl:Label id="MyLabel" runat="server" Font-Bold="True">Text of My label</Ctl:Label>
我想检索这些信息(表格无关紧要,只要信息是分开的):
Tag = "Ctl"
Type = "Label"
id = "MyLabel"
runat = "server"
Font-Bold = "True"
Content = "Text of My label"
This post接近我想要的,但它不允许我检索“我的标签的文字”。
注意:我不需要将此信息放在xml文件中,但为什么不呢。
有什么想法吗?感谢。
编辑:我需要使用C#编写的桌面程序解析很多aspx页面,而不是使用asp.net。
编辑2:为什么?因为我有很多asp.net页面,它包含我维护的服务器控件。我需要检索有关我可以在哪些页面找到这些控件的信息,以及关于它们的大多数信息(名称,id,它们最终具有的内部控件等等,仅表示这些),但只关注主要问题,然后我将处理其余的事情。
答案 0 :(得分:1)
听起来你正试图实现自动化;对我来说,这表明寻找最可靠的解决方案,否则自动化不值得,因为你必须假设它的任何部分可能都失败了。
我可以想到几种方法来解决这个问题:
1 - 正则表达式
只要你不试图将整个事物转化为结构完美的结果,正则表达式就能正常工作。虽然典型的ASCX比纯HTML更加结构化(或者它不会运行),但它仍有可能出现格式错误。因此,它会受到通常的HTML解析缺陷的影响。
2 - Parser
一个简单的状态机解析器可以帮助您识别特定控件并解决正则表达式无法处理的场景。这可以像你想要的那样简单或精细。高级解析器可以构建整个层次结构;一个简单的解析器可能只是检索所有控件和内联代码块(&lt;%=%&gt;)和数据绑定信息。
3 - 使用已编译的程序集
您可能知道,ASP.Net应用程序从标记转换为c#类,然后转换为程序集。这些程序集在%System%\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files
目录中可用。虽然它们没有良好的名称(因为它们不是为了直接消费),但它们做包含.Net查看页面/控件的非常准确的表示。您可以使用反射来访问此数据。
其中一个文件的内容包含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)。
答案 1 :(得分:0)
您可以使用HTML Agility Pack解析文件,然后按元素名称找到控件。