2010-09-26 158 views
3

現在我正在處理一個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); 
    } 
} 

這個工作,但只適用於沒有任何孩子節點。

任何人都可以請幫我解決這個問題,我會非常感激!

問候

//亨裏克

回答

2

爲什麼你不想使用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格式)

1

你可以做的是存儲在臨時IHTMLElement子節點,並更改所需的元素,然後就可以再次注入節點到改變的元素。

我希望它有幫助。

+0

聽起來不錯!儘管我已經在文檔中查找遍地,但我似乎無法找到如何將我的子節點注入到元素中! – nelshh 2010-09-26 19:21:15

1

也許你應該使用的innerText而不是innerHTML屬性,然後你就可以刪除此條件:((IHTMLElementCollection)node.children)。長度== 0

+0

對不起,使用了錯誤的版本,現在已經修復!當使用innerText時,子節點被銷燬! – nelshh 2010-09-26 19:16:58

2

好,似乎很明顯,我(但我沒有測試它),你應該從方法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