私は素晴らしい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());
この問題をどのように解決できますか?