标签:c net html-parsing csquery
我一直在尝试这个奇妙的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值现在都是#.
无论如何,如果我使用每个块(它似乎很好地使用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方法/选择器返回绑定到同一DOM的新CQ对象.
将DOM元素“包装”为像$(元素)之类的CQ对象的正确方法是使用new而不是Create,例如
CQ cqElement = new CQ(element);
还有一个快捷方式,它是IDomObject上的一个方法:
CQ cqElement = element.Cq();
这些元素保持在同一个DOM中. Create方法总是生成一个新的DOM,当从元素创建时,实际克隆它们,因此原始DOM不受影响. (元素只能属于一个DOM;如果要创建两个不同的DOM并使用Append等方法将元素从一个添加到另一个,它们将从源中删除.创建会自动克隆它们.).
我相信这可以在文档中更清楚:)
标签:c,net,html-parsing,csquery 来源: https://codeday.me/bug/20190625/1286508.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。