2010-09-26 28 views
3

En ce moment je travaille sur un add-on Internet Explorer qui est censé scanner un document HTML pour les URL en texte brut, puis les "linkifier". J'ai accès aux sites DOM et j'ai eu l'idée de parcourir tous les nœuds DOM et de rechercher des "liens" en utilisant RegEx, pour remplacer ces textes par du code HTML, cependant, en changeant la propriété "InnerText" de l'objet IHTMLElement, tous ses nœuds enfants sont perdus, ce qui perturbe gravement le site Web.Comment remplacer un contenu de texte interne de balises HTML en utilisant C#!

Voici quelques code:

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

Et voici la fixElement méthode:

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

Cela fonctionne, mais seulement pour les noeuds qui ne dispose pas d'enfants.

Quelqu'un peut-il s'il vous plaît aidez-moi avec ce problème, je serais très reconnaissant!

Cordialement

// Henrik

Répondre

2

Pourquoi vous ne voulez pas utiliser javscript http://userscripts.org/scripts/review/1352 Ensuite, exécutez simplement ce javascript en utilisant votre code C#. juste

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

bonne chose à ce sujet est que vous pouvez faire beaucoup de choses sans même les réinventer, Linkification url est long dos inventé par javascript personnes, donc il suffit d'utiliser ce code ..

Si un script (comme celui-ci est grand, alors vous pouvez insérer du fichier * .js en utilisant ce script)

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

remplacer par votre javascript hébergé sur Internet ou localy (si le fichier d'usage local: // format URL)

1

Ce que vous pouvez faire est de stocker les noeuds enfant dans IHTMLElement température et changer l'élément désiré et vous pouvez injecter les nœuds de nouveau dans l'élément modifié.

J'espère que ça aide.

+0

Ça sonne bien! Bien que j'ai regardé partout dans la documentation, je n'arrive pas à trouver comment injecter mes nœuds fils à l'élément! – nelshh

1

probablement vous devez utiliser innerText au lieu de la propriété innerHTML, et vous serez en mesure de supprimer cette condition: ((IHTMLElementCollection) node.children) == 0 .length

+0

Désolé, utilisé la mauvaise version, c'est réglé maintenant! Lorsque vous utilisez innerText, les nœuds enfants sont détruits! – nelshh

2

Eh bien, il me semble évident (Mais je ne l'ai pas testé), que vous devez supprimer

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

de la première ligne de la méthode fixElement:

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

InnerText est "en lecture seule" donc vous ne pouvez pas le faire – AlbatrossCafe