如何用C#替换HTML标签内部的文本内容!

问题描述:

现在我正在处理一个Internet Explorer添加项,该添加项应该以纯文本格式扫描HTML文档的URL,然后“链接”它们。如何用C#替换HTML标签内部的文本内容!

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

下面是一些代码:

//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); 
    } 
} 

这个工作,但只适用于没有任何孩子节点。

任何人都可以请帮我解决这个问题,我会非常感激!

问候

//亨里克

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

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

关于这个的好处是,你可以做很多事情,甚至没有重新发明它们,网址linkification早已回来的javascript人发明的,所以只使用该代码..

如果任何脚本(像这样的大,那么你可以从* .js文件使用这个脚本插入)

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

替换你的JavaScript托管因特网上或者localy(如果本地使用file:// URL格式)

你可以做的是存储在临时IHTMLElement子节点,并更改所需的元素,然后就可以再次注入节点到改变的元素。

我希望它有帮助。

+0

听起来不错!尽管我已经在文档中查找遍地,但我似乎无法找到如何将我的子节点注入到元素中! – nelshh 2010-09-26 19:21:15

也许你应该使用的innerText而不是innerHTML属性,然后你就可以删除此条件:((IHTMLElementCollection)node.children)。长度== 0

+0

对不起,使用了错误的版本,现在已经修复!当使用innerText时,子节点被销毁! – nelshh 2010-09-26 19:16:58

好,似乎很明显,我(但我没有测试它),你应该从方法fixElement的第一行中删除

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

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

InnerText是“只读”,所以你不能这样做 – AlbatrossCafe 2016-07-19 19:09:24