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 ファイルに入れる必要はありませんが、そうする必要はありません。

何か案が?ありがとう。

編集: asp.net ではなく、C# で記述されたデスクトップ プログラムを使用して、多くの aspx ページを解析する必要があります。

編集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 がページ/コントロールをどのように表示するかを非常に正確に表現したものを含んでいます。リフレクションを使用してこのデータにアクセスできます。

これらのファイルのいずれかの内容には、次の宣言のようなデータが含まれています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 では、最も多くの作業が必要になります。

最後に、マークアップから C# へのコンバーターにプログラムでアクセスし、アセンブリを自分でコンパイルする方法があるかもしれません (アプリケーションが最初にアクセスされたときに行われるように - オプション #3 と同様)。

于 2012-08-23T17:06:05.357 に答える
0

HTML Agility Packを使用してファイルを解析し、要素名でコントロールを見つけることができる場合があります。

于 2012-08-23T17:11:26.610 に答える