Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET-在渲染期间使用HAP(HTML Agility Pack)添加类引用_Html_Asp.net_Webforms_Html Parsing_Csquery - Fatal编程技术网

ASP.NET-在渲染期间使用HAP(HTML Agility Pack)添加类引用

ASP.NET-在渲染期间使用HAP(HTML Agility Pack)添加类引用,html,asp.net,webforms,html-parsing,csquery,Html,Asp.net,Webforms,Html Parsing,Csquery,是否可以使用HAP HTML Agility Pack来: 获取节点的集合,例如作为元素子元素的所有元素 迭代集合 将CSS类引用添加到每个元素的class属性中,例如class&=foo 在HTML中更新节点的原始位置 对于第4点,我需要知道是否: 当我获取一组节点时,我是否在处理副本? 如果是这样,我可以轻松地在HTML中更新节点的原始位置吗 最后,在ASP.NET网站中呈现页面时,考虑到以下因素,这样做是否可行: 我将需要修改不超过100个类引用 元素 我没有处理大型HTML文档 我计划从

是否可以使用HAP HTML Agility Pack来:

获取节点的集合,例如作为元素子元素的所有元素 迭代集合 将CSS类引用添加到每个元素的class属性中,例如class&=foo 在HTML中更新节点的原始位置 对于第4点,我需要知道是否:

当我获取一组节点时,我是否在处理副本? 如果是这样,我可以轻松地在HTML中更新节点的原始位置吗 最后,在ASP.NET网站中呈现页面时,考虑到以下因素,这样做是否可行:

我将需要修改不超过100个类引用 元素 我没有处理大型HTML文档 我计划从一个div开始选择节点,例如div[2],其中body 包含4个div 我意识到这似乎是一堆独立的问题,但实际上这只是以下两个问题的分解:

我是否可以轻松修改ASP.NET页面的HTML输出,例如插入类引用? 在50-100个元件的WRT速度下进行此操作是否可行,例如,成本不超过2秒? 非常感谢。

不要那样做!ASP.NET并不打算以这种方式使用,有更好的方法来完成这项任务,这取决于您如何在希望更改或添加css类的情况下创建标记。ASP.NET使用aspx模板,基本上是html标记,在这里您可以干预服务器上执行的代码,在这里您可以静态地设置css类,或者使用服务器端脚本在标记上使用一些代码设置css类

您还可以在代码隐藏中创建控件,并将css设置为控件。如果锚控件具有父控件,即列表项控件,则必须使用服务器端控件


若要按您的方式执行,您必须创建响应过滤器示例,并在请求完成后进行解析,将结果和更改写回响应流。使用常见的ASP.NET技术要容易得多。

请查看我的CsQuery项目:或在nuget上作为CsQuery

这是jQuery的C.NET4端口。选择器比HTML Agility Pack快几个数量级;事实上,我写它的最初目的就是要做你想做的事情:实时操作HTML。碰巧的是,它来自一个CMS,带有由ckeditor生成的html

要使用CsQuery截取webforms中的HTML,请在页面代码隐藏中执行此操作:

using CsQuery;
using CsQuery.Web;

protected override void Render(HtmlTextWriter writer)
{

   // the CsQueryHttpContext object is part of the CsQuery library, it's a helper 
   // than abstracts the process of intercepting base.Render() for you.

    CsQueryHttpContext csqContext = 
        WebForms.CreateFromRender(Page, base.Render, writer);

    // CQ object is like a jQuery object. The "Dom" property of the context
    // returned above represents the output of this page.

    CQ doc = csqContext.Dom;

    doc["li > a"].AddClass("foo");

    // write it
    csqContext.Render();
}
GitHub上有基本的文档,但除了输入和输出HTML之外,它的工作原理与jQuery非常相似。上面的WebForms对象只是为了帮助您处理与HtmlTextWriter对象和Render方法的交互。通用用途非常简单:

var doc = CQ.Create(htmlString);
// or 
var doc = CQ.CreateFromUrl(url);

.. do stuff with doc, a CQ object that acts like a jQuery object

string html = doc.Render();

请展开,不要使用模板,你指的是母版页吗?请你用一些代码来说明你的备选方案好吗?我所说的模板是指aspx和ascx页面。这取决于您当前创建锚和列表的方式,它们是在标记中定义的吗?它是ASPX页面中的标记和来自数据库的HTML的混合。从数据库获取HTML时,您不能设置css类吗?a是与任何.NET库相同b是c它是一个类,不是数据类型-仅用于处理呈现方法d是e示例1是您将在webforms页面中使用的。示例2只是向您展示它在一般上下文中是如何工作的。WebForms类将做同样的事情,不管怎样,它都是从一个字符串开始的,但是从HtmlTextWriter到一个普通的旧字符串,再返回,有点麻烦;那门课涵盖了这一点。看看WebForms对象的源代码,看看它是如何工作的,它主要在StringBuilder和TextWriter之间转换,等等。。。因为你不应该担心任何事情。在你最初的q。你说的不超过2秒。对于一些基本性能测试,我使用一个包含100000个元素的6MB文件。在我的笔记本电脑上,CsQuery可以在2秒钟内解析它,并执行一个由两部分组成的选择器div>span,返回大约2000个span,大约15毫秒。更改元素根本不需要时间,只需设置属性即可。因此,处理正常大小的HTML文件时,执行一组典型操作的时间以毫秒为单位。但是,只要尝试一下,看看它是如何为您工作的。上面的代码是您真正需要与webforms集成的所有代码,如果您有具体问题,请随时直接与我联系。在github repo的自述文件中,有更多与我的答案相关的文档。我认为它的优点是速度快,而且对于选择和操作HTMLCSS选择器和jQueryAPIoh语法熟悉。当然,只需添加对CsQuery.dll的引用。最简单的方法就是使用NuGet软件包管理器:安装软件包csquery,它将被下载并添加到您的软件包中;请参阅:实际上,只有在事先知道对象的类型时才能使用它。它只是让代码更具可读性。CreateFromRender返回用于恢复法力的特殊对象 ge与渲染覆盖的交互,它是CsQuery的一部分,属于CsQueryHttpContext类型