4

私は素晴らしいCsQueryライブラリを試してきました。これは基本的に jQuery の .NET ポートであり、os CSS セレクターと jQuery のほとんどの機能を使用できます。

私はそれを使用して、HTML ファイルのバッチを解析および編集しています (特に、さまざまな DOM 要素のいくつかの属性を編集しています)。

次の C# スニペットは、私が行っていることの一種を示しています。コメントには、JavaScript/jQuery と同等のコードが含まれています。

FileStream doc = File.Open(/*some html file*/);    

CQ dom = CQ.Create(doc);        // $dom = $(document);
CQ images = dom.Select("img");  // $images = $('img');
images.Attr("src","#");         // $images.attr('src','#');

dom.Save(/*Output path*/); // No jQuery equivalent, this just saves the file.

これは完全に機能します。出力ファイルを確認すると、すべての画像のsrc値が#.

とにかく、Eachブロックを使用すると ( C# ラムダ式を使用して javascript の関数の受け渡しをシミュレートするとうまく動作するようです)、変更は出力ファイルに適用されません。

FileStream doc = File.Open(/*same html file*/);

CQ dom = CQ.Create(doc);                  // $dom = $(document);
CQ images = dom.Select("img");            // $images = $('img');
images.Each( (element) => {               // $images.each( function(){
  CQ cqElement = CQ.Create(element);      //   $element = $(this);
  cqElement.Attr("src","#");              //   $element.attr('src','#');
  Messagebox.Show(cqElement.Attr("src")); //   alert($element.attr('src'));
});                                       // });

dom.Save(/*Output path*/); // No jQuery equivalent, this just saves the file.

Messabox が DOM 内のすべての画像に対して "#" を表示しているにもかかわらず (これはcqElement、変更を取得することを意味します)、出力ファイルは変更を取得しません。

問題の原因となっている重要な行はCQ cqElement = CQ.Create(element);、新しい CsQuery オブジェクトを作成するためだと思います。実際、最初のメッセージ ボックスの直後に、次のような別のメッセージ ボックスが表示された場合、変更は行われません。cqElement

Messagebox.Show(dom.Html()); // alert($dom.html());

この問題をどのように解決できますか?

4

1 に答える 1

4

あなたは絶対に正しいです:CQ cqElement = CQ.Create(element)問題です。これが、CsQuery と jQuery の最も大きな違いの核心です。jQuery では、DOM は 1 つだけです。CsQuery にはブラウザーがないため、個別の DOM はいくつでも存在できます。使用するたびにCreate、まったく新しい DOM になります。一方、jQuery メソッド/セレクターCQは、同じ DOM にバインドされた新しいオブジェクトを返します。

is with and notのCQようなオブジェクト として DOM 要素を「ラップ」する正しい方法は、たとえば$(element)newCreate

CQ cqElement = new CQ(element);

のメソッドであるショートカットもありますIDomObject

CQ cqElement = element.Cq();

これらは要素を同じ DOM に保持します。メソッドはCreate常に新しい DOM を生成し、要素から作成されると実際にそれらを複製するため、元の DOM は影響を受けません。(要素は 1 つの DOM にのみ属することができます。2 つの異なる DOM を作成し、 のような方法を使用して 1 つの要素から別の要素に追加する場合Append、それらはソースから削除されます。Create自動的に複製されます)。

これはドキュメントでより明確にすることができると確信しています:)

于 2013-01-09T19:45:50.547 に答える