Здравствуйте!
хочу распарсить Текст в 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
ссылка на оригинальное сообщение
Возможно для такой задачи HTML парсить чем-то другим...
Только пожалуйста не предлагайте проходить по строкам ручкаим
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Здравствуйте, Dmitry ., Вы писали:
D>Возможно для такой задачи HTML парсить чем-то другим...
D>Только пожалуйста не предлагайте проходить по строкам ручкаим
D>
данное сообщение получено с www.gotdotnet.ru
D>ссылка на оригинальное сообщение
вырезай html-код с помощью RegExp
много примеров найдешь на regexplib.com
Gotdotnet.User.State happy = google("Html2Xml | SgmlReader");
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
вырезай html-код с помощью RegExp
много примеров найдешь на regex
Не сказал бы что это супер здорово...
Реально нужно не вырезать, а заменять
Кроме того, регулярные выражения в этом плане тупее mshtml. Стоит ли говорить про стандартные "опечатки" внутри html которые IE понимает, и тд и тп. Автоматическое закрытие открытых тегов... и прочее.
Потому хочется работать именно с распарсенной html-кой.
Есть какие-нибудь идеи ?
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Gotdotnet.User.State happy = Inet.Google("Html2Xml | SgmlReader");
Допустим, HTML в XML мне перегонять совсем не надо
Как c помощью SgmlReader прочитать весь текст, из примера в пред. посте, преобразовать текст (это я знаю

, и затем (самое ВАЖНОЕ), засунуть его неместо ?
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Господа, всем спасибо!
Ответ крылся в дебрях 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("&", "&").Replace("<", "<").Replace(">", ">");
}
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
ссылка на оригинальное сообщение