1

给定一个 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"

这篇文章接近我想要的,但它不允许我检索例如“我的标签文本”。

注意:我不需要将这些信息放在 xml 文件中,但为什么不呢。

任何的想法?谢谢。

编辑:我需要使用用 C# 编写的桌面程序解析很多 aspx 页面,而不是使用 asp.net。

编辑2:为什么?因为我有很多 asp.net 页面,其中包含我维护的服务器控件。我需要检索有关在哪些页面中可以找到这些控件的信息,以及有关它们的大多数信息(名称、ID、它们最终拥有的内部控件等,仅此而已),但只关注主要问题,然后我会处理剩下的。

4

2 回答 2

1

听起来您正在尝试实现自动化;对我来说,这建议寻找最可靠的解决方案,否则自动化并不值得,因为您将不得不假设它的任何部分都可能失败。

我可以想到几种方法来解决这个问题:

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)。

于 2012-08-23T17:06:05.357 回答
0

您可以使用HTML Agility Pack解析文件,然后按元素名称定位控件。

于 2012-08-23T17:11:26.610 回答