IHTMLElement или что-то еще?!
От: Аноним  
Дата: 21.08.06 20:10
Оценка:
Здравствуйте!

хочу распарсить Текст в html-документе. А именно, взать по кусочкам все текстовые блоки, применить к ним преобразование, сложить обратно в HTML-элементы и вернуть отформатированный HTML-документ

Прохожу по тегам...



using System;
using mshtml;


namespace tumen.framework.content.Typo
{
public class Typo
{
private string _htmlText;
IHTMLDocument2 _htmlDoc;
HTMLDocumentClass _htmldocClass;

public Typo(string htmlText)
{
_htmlText = htmlText;

_htmldocClass = new HTMLDocumentClass();
_htmlDoc = _htmldocClass as IHTMLDocument2;
_htmlDoc.write(htmlText);
}

public string goToBody()
{
string result = "";

IHTMLElementCollection elementColection = (IHTMLElementCollection)_htmlDoc.all.tags("body");

if (null == elementColection)
return result;

if (0 == elementColection.length)
return result;

return goToElement((IHTMLElement)elementColection.item(null, 0));
}

protected string goToElement(IHTMLElement element)
{
string result = "";
IHTMLElementCollection children = (IHTMLElementCollection)element.children;

if (children.length > 0)
{
foreach (IHTMLElement child in children)
result += "[" + " " + child.tagName +"]" + goToElement( child );
}
else
result += element.outerText;


return result;
}
}
}




тут же выясняется, что такой способ выдергивает не весь текст. Например, для документа
<p>111<b>222</b>333</b>444</p>

алгоритм найдет только 222 333

Подскажите, как можно достучаться до 111 и 444. И как после преобразования их положить на место?...

Заранее спасибо!


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
RE: IHTMLElement или что-то еще?!
От: Аноним  
Дата: 22.08.06 07:45
Оценка:
Возможно для такой задачи HTML парсить чем-то другим...
Только пожалуйста не предлагайте проходить по строкам ручкаим


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[2]: IHTMLElement или что-то еще?!
От: Geni  
Дата: 22.08.06 09:37
Оценка:
Здравствуйте, Dmitry ., Вы писали:

D>Возможно для такой задачи HTML парсить чем-то другим...

D>Только пожалуйста не предлагайте проходить по строкам ручкаим

D>
данное сообщение получено с www.gotdotnet.ru

D>ссылка на оригинальное сообщение


вырезай html-код с помощью RegExp
много примеров найдешь на regexplib.com
RE: IHTMLElement или что-то еще?!
От: Аноним  
Дата: 22.08.06 09:39
Оценка:
Gotdotnet.User.State happy = google("Html2Xml | SgmlReader");


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
RE: Re[2]: IHTMLElement или что-то еще?!
От: Аноним  
Дата: 22.08.06 10:05
Оценка:
вырезай html-код с помощью RegExp
много примеров найдешь на regex


Не сказал бы что это супер здорово...
Реально нужно не вырезать, а заменять

Кроме того, регулярные выражения в этом плане тупее mshtml. Стоит ли говорить про стандартные "опечатки" внутри html которые IE понимает, и тд и тп. Автоматическое закрытие открытых тегов... и прочее.

Потому хочется работать именно с распарсенной html-кой.
Есть какие-нибудь идеи ?


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
RE[2]: IHTMLElement или что-то еще?!
От: Аноним  
Дата: 22.08.06 10:08
Оценка:
Gotdotnet.User.State happy = Inet.Google("Html2Xml | SgmlReader");

Допустим, HTML в XML мне перегонять совсем не надо

Как c помощью SgmlReader прочитать весь текст, из примера в пред. посте, преобразовать текст (это я знаю, и затем (самое ВАЖНОЕ), засунуть его неместо ?


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
RE: IHTMLElement или что-то еще?!
От: Аноним  
Дата: 23.08.06 17:05
Оценка:
Господа, всем спасибо!
Ответ крылся в дебрях DOM:



using System;
using System.IO;
using mshtml;


namespace tumen.framework.content.Typo
{
public class Typo
{
private string _htmlText;
IHTMLDocument2 _htmlDoc;
HTMLDocumentClass _htmldocClass;
private TypoFormattersRegistry _formattersRegistry = new TypoFormattersRegistry();

public Typo(string htmlText)
{
_htmlText = htmlText;

_htmldocClass = new HTMLDocumentClass();
_htmlDoc = _htmldocClass as IHTMLDocument2;
_htmlDoc.write(htmlText);
}

public string goToBodyNode()
{
IHTMLElementCollection elementColection = (IHTMLElementCollection)_htmlDoc.all.tags("body");

if (null == elementColection)
return "";

if (0 == elementColection.length)
return "";

IHTMLDOMNode body = (IHTMLDOMNode)elementColection.item(null, 0);
goToNode(body);
return ((IHTMLElement)body).innerHTML.Replace("&amp;", "&").Replace("&lt;", "<").Replace("&gt;", ">");
}


protected string goToNode(IHTMLDOMNode node)
{
string result = "";
IHTMLDOMChildrenCollection children = (IHTMLDOMChildrenCollection)node.childNodes;

if (children.length > 0)
{
foreach (IHTMLDOMNode child in children)
goToNode( child );
}
else
node.nodeValue = _formattersRegistry.applyFormatters2(node.nodeValue.ToString());

return result;
}
}
}




данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.