Как заменить HTML-теги внутренним текстовым контентом с помощью C #! - PullRequest
3 голосов
/ 26 сентября 2010

Сейчас я работаю над надстройкой Internet Explorer, которая должна сканировать HTML-документ на наличие URL-адресов в виде обычного текста, а затем «связывать» их.

У меня есть доступ к DOM веб-сайтов.У него была идея обойти все DOM-узлы и найти «ссылки» с помощью RegEx, чтобы заменить этот текст HTML-кодом, однако при изменении свойства «InnerText» объекта IHTMLElement все его дочерние узлыпотерял, что серьезно f * cks вверх веб-сайта.

Вот некоторый код:

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

Это работает, нотолько для узлов, у которых нет дочерних элементов.

Может кто-нибудь помочь мне с этой проблемой, я был бы очень признателен!

С уважением

// Henrik

Ответы [ 4 ]

2 голосов
/ 21 ноября 2012

Ну, мне кажется очевидным (но я не проверял это), что вы должны удалить

((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 голосов
/ 27 сентября 2010

Почему вы не хотите использовать javscript следующим образом http://userscripts.org/scripts/review/1352 Затем просто выполните этот javascript, используя ваш код на c #.просто

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

Хорошо, что вы можете делать много вещей, даже не изобретая их заново, ссылки на URL давно придуманы людьми из javascript, поэтому просто используйте этот код ..

Если какой-либо скрипт (например, этот большой, то вы можете вставить из файла * .js с помощью этого скрипта)

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

заменить на свой javascript, размещенный в интернете ИЛИ локально (если локально используете file: // urlформат)

1 голос
/ 26 сентября 2010

Возможно, вам следует использовать innerText вместо свойства innerHTML, и тогда вы сможете удалить это условие: ((IHTMLElementCollection) node.children) .length == 0

1 голос
/ 26 сентября 2010

Что вы можете сделать, это сохранить дочерние узлы во временном элементе IHTMLElement и изменить нужный элемент, а затем снова вставить узлы в измененный элемент.

Надеюсь, это поможет.

...