gpt4 book ai didi

c# - 使每个 block 内的更改持久化

转载 作者:太空狗 更新时间:2023-10-30 01:22:11 26 4
gpt4 key购买 nike

我一直在尝试神奇的 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 block (使用 C# lambda expressions 模拟 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());

关于如何解决这个问题有什么想法吗?

最佳答案

您完全正确:CQ cqElement = CQ.Create(element) 就是问题所在。这是 CsQuery 和 jQuery 之间最显着区别的核心。使用 jQuery,只有一个 DOM。使用 CsQuery,没有浏览器,因此可以有任意数量的不同 DOM。每次使用 Create 时,它都是一个全新的 DOM;而 jQuery 方法/选择器返回绑定(bind)到同一 DOM 的新 CQ 对象。

将 DOM 元素“包装”为 CQ 对象(如 $(element))的正确方法是使用 new 而不是 创建,例如

CQ cqElement = new CQ(element);

还有一个快捷方式,它是 IDomObject 上的一个方法:

CQ cqElement = element.Cq();

这些使元素保持在同一个 DOM 中。 Create 方法总是生成一个新的 DOM,当从元素创建时,实际上是克隆它们,这样原始 DOM 就不会受到影响。 (元素只能属于一个 DOM;如果您要创建两个不同的 DOM,并使用 Append 之类的方法将元素从一个添加到另一个,它们将从源中删除。Create 自动克隆它们。)。

我相信这可以在文档中说得更清楚 :)

关于c# - 使每个 block 内的更改持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14244967/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com