3

是否可以使用 HAP(HTML 敏捷包)来:

  1. 获取节点集合,例如<a>作为元素子级的所有<li>元素
  2. 遍历集合
  3. 将 CSS 类引用添加到每个元素的类属性中,例如class &= "foo"
  4. 更新 HTML 中原始位置的节点

对于第 4 点,我需要知道是否:

  • 当我抓取一组节点时,我是否在使用副本?
  • 如果是这样,我可以轻松地更新 HTML 中原始位置的节点吗

最后,在 ASP.NET 网站中呈现页面时这样做是否可行,考虑到:

  • 我将需要修改不超过 100 个元素的类引用
  • 我没有处理大型 HTML 文档
  • 我计划从一个 div 开始选择我的节点,例如div[2]body 包含 4divs

我意识到这可能看起来像是一堆单独的问题,但实际上它只是以下两个问题的细分:

  • 我可以轻松地修改 ASP.NET 页面的 HTML 输出,例如插入类引用吗?
  • 在 50 - 100 个元素的 WRT 速度上执行此操作是否可行,例如不超过 2 秒的成本?

非常感谢。

4

2 回答 2

1

不要那样做!ASP.NET 并不意味着以这种方式使用,有更好的方法来完成此任务,具体取决于您如何在想要更改或添加 css 类的女巫中创建该标记。ASP.NET 使用 aspx 模板,基本上是 html 标记,在那里您可以干预在服务器上执行的代码,在这里您可以静态设置 css 类或使用服务器端脚本通过一些代码在标记上设置 css 类。

如果锚控件的父控件是列表项控件(您必须使用服务器端控件),您还可以在代码后面创建控件并将 css 设置为控件。

要按照自己的方式进行操作,您必须制作响应过滤器(此处为示例),并在请求完成后进行解析并将结果写入响应流并更改回响应流。使用常见的 ASP.NET 技术要容易得多。

于 2012-06-11T21:19:44.293 回答
1

查看我的 CsQuery 项目:https ://github.com/jamietre/csquery或在 nuget 上作为“CsQuery”。

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

要使用 CsQuery 拦截 Web 表单中的 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();
于 2012-06-13T12:39:45.607 回答