现在我正在开发一个Internet Explorer,它应该以纯文本格式扫描HTML文档中的URL,然后“链接”它们。
我可以访问网站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-method:
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);
}
}
这样可行,但仅限于没有任何子节点的节点。
任何人都可以帮我解决这个问题,我将非常感激!
此致
//亨利克
答案 0 :(得分:2)
为什么你不想像这样使用javscript http://userscripts.org/scripts/review/1352 然后使用您的c#代码执行此javascript。 只是
webBrowser1.Navigate(new Uri("javascript:<YOURSCRIPT>"));
关于这一点的好处是你可以做很多事情而不需要重新发明它们,网址链接是由javascript人员发明的,所以只需使用该代码..
如果有任何脚本(比如这个脚本很大,那么你可以使用这个脚本从* .js文件中插入)
javascript:(function(){document.body.appendChild(document.createElement('script')).src='<YOUR SCRIPT URL>';})();
替换为您在互联网上托管的javascript或localy(如果本地使用file:// url格式)
答案 1 :(得分: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");
}
...
}
答案 2 :(得分:1)
您可以做的是将子节点存储在temp IHTMLElement中并更改所需的元素,然后您可以将节点重新注入更改的元素中。
我希望它有所帮助。
答案 3 :(得分:1)
可能你应该使用innerText而不是innerHTML属性,然后你就可以删除这个条件:((IHTMLElementCollection)node.children)。length == 0