私の CsQuery プロジェクトをチェックしてください: https://github.com/jamietre/csqueryまたは "CsQuery" として nuget で。
これは、jQuery の C# (.NET 4) ポートです。基本的なパフォーマンス テスト (プロジェクト テスト スイートに含まれる) では、セレクターは HTML Agility Pack + Fizzler (HAP の CSS セレクター アドオン) よりも約 100 倍高速です。典型的な Web サイトでリアルタイムに出力ストリームを操作するには、十分に高速です。あなたがamazon.comか何かなら、もちろんYMMV.
これを開発した最初の目的は、コンテンツ管理システムから HTML を操作することでした。起動して実行すると、CSS セレクターと jQuery API を使用する方が、Web コントロールを使用するよりもはるかに楽しいことがわかり、サーバーでレンダリングされたページの主要な HTML 操作ツールとして使用し始め、カバーするために構築しました。 CSS、jQuery、ブラウザ DOM のほぼすべて。それ以来、私は Web コントロールに触れていません。
CsQuery を使用して Web フォームの HTML をインターセプトするには、ページの分離コードで次のようにします。
using CsQuery;
using CsQuery.Web;
protected override void Render(HtmlTextWriter writer)
{
var csqContext = WebForms.CreateFromRender(Page, base.Render, writer);
// CQ object is like a jQuery object. The "Dom" property of the context
// returned above represents the output of this page.
CQ doc = csqContext.Dom;
doc["li > a"].AddClass("foo");
// write it
csqContext.Render();
}
ASP.NET MVC で同じことを行うには、それについて説明しているこのブログ投稿を参照してください。
GitHub に CsQuery の基本的なドキュメントがあります。HTML の入出力を除けば、jQuery とほとんど同じように機能します。上記のオブジェクトは、オブジェクトとメソッドとのWebForms
やり取りを処理するのに役立ちます。一般的な使用法は非常に単純です。HtmlTextWriter
Render
var doc = CQ.Create(htmlString);
// or (useful for scraping and testing)
var doc = CQ.CreateFromUrl(url);
// do stuff with doc, a CQ object that acts like a jQuery object
doc["table tr:first"].Append("<td>A new cell</td>");
さらに、ブラウザーで使用するのと同じメソッドを使用して、ブラウザー DOM のほぼ全体を使用できます。インデクサー [0] は、jquery のように選択セットの最初の要素を返します。HTML を操作するための JavaScript の記述に慣れている場合は、非常に使い慣れているはずです。
// "Select" method is the same as the property indexer [] we used above.
// I go back and forth between them to emphasise their interchangeability.
var element = dom.Select("div > input[type=checkbox]:first-child")[0];
a.Checked=true;
もちろん、C# では、LINQ などの他の汎用ツールを自由に使用できます。または:
var element = dom["div > input[type=checkbox]:first-child"].Single();
a.Checked=true;
ドキュメントの操作が終わったら、おそらく HTML を取り出したいと思うでしょう:
string html = doc.Render();
それだけです。オブジェクトには膨大な数のメソッドがあり、CQ
すべての jQuery DOM 操作テクニックを網羅しています。また、JSON を処理するためのユーティリティ メソッドもあり、jQuery のように、データ構造 (CSS クラスのセットなど) をできるだけ簡単に渡すことができるように、動的型と匿名型を幅広くサポートしています。
より高度なもの
asp.net の http ワークフローの低レベルの操作に慣れていない限り、これを行うことはお勧めしません。元に戻すことはできませんが、HttpHandler について聞いたことがない場合は学習曲線が必要になります。
WebForms エンジンを完全にスキップする場合は、IHttpHandler
HTML ファイルを自動的に解析する を作成できます。これは、ASPX エンジンにオーバーレイするよりも確実にパフォーマンスが向上します。おそらく、Web コントロールを使用してサーバー側で同量の処理を行うよりも高速です。その後、特定の拡張子 (や など) のweb.config を使用してハンドラーを登録できます。htm
html
自動的にインターセプトするもう 1 つの方法は、ルーティングを使用することです。問題なく Web フォーム アプリで MVC ルーティング ライブラリを使用できます。これを行う方法の 1 つの説明を次に示します。次に、任意のパターン (これもおそらく*.html
) に一致するルートを作成し、処理をカスタムIHttpHandler
またはクラスに渡すことができます。この場合、すべてを行っています。パスを確認し、ファイル システムからファイルをロードし、CsQuery で解析し、応答をストリーミングする必要があります。
もちろん、どちらのメカニズムを使用する場合でも、ページごとに実行するコードをプロジェクトに伝える方法が必要になります。つまり、気の利いた HTML パーサーを作成したからといって、そのページに対して正しい「コード ビハインド」を実行するようにどのように指示するのでしょうか?
MVC は、"PageNameController.cs" という名前のコントローラーを見つけて、パラメーターの名前に一致するメソッドを呼び出すだけでこれを行います。やりたいことは何でもできます。たとえば、次の要素を追加できます。
<script type="controller" src="MyPageController"></script>
ジェネリック ハンドラー コードでそのような要素を探し、リフレクションを使用して、呼び出す正しい名前付きクラスとメソッドを見つけることができます。これはかなり複雑で、この回答の範囲を超えています。しかし、まったく新しいフレームワークまたは何かを構築しようとしている場合は、これがその方法です。