自動化を実現しようとしているようです。私には、それは最も信頼できる解決策を探すことを示唆しています。
これにアプローチするために私が考えることができるいくつかの方法があります:
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 と同様)。