我一直在尝试奇妙的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# lambda 表达式来模拟 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 对象。事实上,如果在第一个 Messagebox 之后我弹出另一个像下面这样的,它不会对cqElement
Messagebox.Show(dom.Html()); // alert($dom.html());
关于如何解决这个问题的任何想法?