3

HAP(HTML Agility Pack)を使用して次のことを行うことは可能ですか?

  1. ノードのコレクションを取得します。たとえば、<a>要素の子であるすべての<li>要素
  2. コレクションを繰り返し処理します
  3. 各要素のクラス属性にCSSクラス参照を追加します。class &= "foo"
  4. HTML内の元の位置でノードを更新します

ポイント4については、次のことを知る必要があります。

  • ノードのコレクションを取得するとき、コピーを使用していますか?
  • もしそうなら、HTML内の元の位置にあるノードを簡単に更新できますか?

最後に、ASP.NET Webサイトでページをレンダリングするときに、次のことを考慮してこれを行うのが実用的でしょうか。

  • 100個以下の要素のクラス参照を変更する必要があります
  • 大きなHTMLドキュメントを使用していません
  • divで始まるノードを選択する予定です。たとえばdiv[2]bodyに4が含まれている場合divs

これは一連の個別の質問のように見えるかもしれませんが、実際には次の2つの質問の内訳にすぎません。

  • ASP.NETページのHTML出力を簡単に変更できますか?たとえば、クラス参照を挿入できますか?
  • 50〜100要素のWRT速度でこれを行うのは実用的でしょうか?たとえば、2秒以下のコストですか?

どうもありがとう。

4

2 に答える 2

1

そうしないでください!ASP.NET はそのように使用することを意図したものではありません。CSS クラスを変更または追加する魔女でそのマークアップをどのように作成するかによって、このタスクを実行するためのより良い方法があります。ASP.NET は aspx テンプレート、基本的には html マークアップを使用し、サーバー上で実行されているコードに介入できます。ここでは、css クラスを静的に設定するか、サーバー側スクリプトを使用してマークアップに css クラスを設定するコードを使用できます。

コード ビハインドでコントロールを作成し、アンカー コントロールがリスト アイテム コントロールである親を持つ場合は、css をコントロールに設定することもできます (サーバー側コントロールを使用する必要があります)。

あなたのやり方でそれを行うには、応答フィルターを作成する必要があります (例はこちら)。要求が完了したら、解析を行い、結果と変更を応答ストリームに書き戻します。一般的な ASP.NET 手法を使用すると、はるかに簡単になります。

于 2012-06-11T21:19:44.293 に答える
1

私の CsQuery プロジェクトをチェックしてください: https://github.com/jamietre/csqueryまたは "CsQuery" として nuget で。

これは、jQuery の C# (.NET 4) ポートです。セレクターは、HTML Agility Pack よりも桁違いに高速です。実際、これを書いた最初の目的は、HTML をリアルタイムで操作するという、あなたがやりたいことを正確に行うことでした。たまたま、ckeditor によって生成された html を含む CMS から。

CsQuery を使用して Web フォームの HTML をインターセプトするには、ページの分離コードで次のようにします。

using CsQuery;
using CsQuery.Web;

protected override void Render(HtmlTextWriter writer)
{

   // the CsQueryHttpContext object is part of the CsQuery library, it's a helper 
   // than abstracts the process of intercepting base.Render() for you.

    CsQueryHttpContext 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();
}

GitHub に基本的なドキュメントがありますが、HTML の入出力を除けば、jQuery とほとんど同じように機能します。上記のオブジェクトは、オブジェクトとメソッドとのWebFormsやり取りを処理するのに役立ちます。一般的な使用法は非常に単純です。HtmlTextWriterRender

var doc = CQ.Create(htmlString);
// or 
var doc = CQ.CreateFromUrl(url);

.. do stuff with doc, a CQ object that acts like a jQuery object

string html = doc.Render();
于 2012-06-13T12:39:45.607 に答える