3

现在我正在开发一个 Internet Explorer 插件,它应该以纯文本形式扫描 HTML 文档中的 URL,然后“链接”它们。

我可以访问网站 DOM,并且想遍历所有 DOM 节点并使用 RegEx 搜索“链接”,以用 HTML 代码替换这些文本,但是,当更改 IHTMLElement 对象的“InnerText”属性时,它的所有子节点都丢失了,这严重影响了网站。

这是一些代码:

//This method is called when IE has finished loading a page
void _webBrowser2Events_DocumentComplete(object pDisp, ref object URL)
{
    if (pDisp == _webBrowser2)
    {
        HTMLDocument pageContent = _webBrowser2.Document;
        IHTMLElement bodyHtmlElmnt = pageContent.body;
        fixElement(bodyHtmlElmnt);
    }   
}

这是 fixElement 方法:

void fixElement(IHTMLElement node)
{
    if (node.innerText!=null && ((IHTMLElementCollection)node.children).length==0)
    {
        node.innerText= node.innerText.Replace("testString", "replaceWithThis");
    }

    foreach (IHTMLElement child in (node.children as mshtml.IHTMLElementCollection))
    {
        fixElement(child);
    }
}

这有效,但仅适用于没有任何子节点的节点。

谁能帮我解决这个问题,我将不胜感激!

问候

//亨里克

4

4 回答 4

2

为什么你不想像这样使用 javscript http://userscripts.org/scripts/review/1352 然后只需使用你的 c# 代码执行这个 javascript。只是

webBrowser1.Navigate(new Uri("javascript:<YOURSCRIPT>"));

这样做的好处是你可以做很多事情而无需重新发明它们,url 链接很久以前是由 javascript 人发明的,所以只需使用该代码..

如果有任何脚本(比如这个很大,那么您可以使用此脚本从 *.js 文件中插入)

javascript:(function(){document.body.appendChild(document.createElement('script')).src='<YOUR SCRIPT URL>';})();

替换为您在 Internet 或本地托管的 javascript(如果本地使用 file:// url 格式)

于 2010-09-27T11:25:40.370 回答
2

好吧,对我来说似乎很明显(但我没有测试过),你应该删除

((IHTMLElementCollection)node.children).length==0

从方法 fixElement 的第一行开始:

void fixElement(IHTMLElement node)
{
    if (node.innerText!=null) // && ((IHTMLElementCollection)node.children).length==0)
    {
         node.innerText= node.innerText.Replace("testString", "replaceWithThis");
    }
    ...
}
于 2012-11-21T08:24:18.573 回答
1

您可以做的是将子节点存储在 temp IHTMLElement 中并更改所需的元素,然后您可以将节点再次注入到更改的元素中。

我希望它有所帮助。

于 2010-09-26T19:09:22.277 回答
1

可能您应该使用 innerText 而不是 innerHTML 属性,然后您就可以删除此条件: ((IHTMLElementCollection)node.children).length==0

于 2010-09-26T19:10:36.323 回答