Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
IHTMLElement или что-то еще?!
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! хочу распарсить Текст в 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. И как после преобразования их положить на место?... Заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 00:10 |
|
||
|
IHTMLElement или что-то еще?!
|
|||
|---|---|---|---|
|
#18+
Возможно для такой задачи HTML парсить чем-то другим... Только пожалуйста не предлагайте проходить по строкам ручкаим:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 11:45 |
|
||
|
IHTMLElement или что-то еще?!
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, Dmitry ., Вы писали: D>Возможно для такой задачи HTML парсить чем-то другим... D>Только пожалуйста не предлагайте проходить по строкам ручкаим:) D> данное сообщение получено с www.gotdotnet.ru D>ссылка на оригинальное сообщение вырезай html-код с помощью RegExp много примеров найдешь на regexplib.com ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 13:37 |
|
||
|
IHTMLElement или что-то еще?!
|
|||
|---|---|---|---|
|
#18+
Gotdotnet.User.State happy = Inet.Google("Html2Xml | SgmlReader"); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 13:40 |
|
||
|
IHTMLElement или что-то еще?!
|
|||
|---|---|---|---|
|
#18+
вырезай html-код с помощью RegExp много примеров найдешь на regex Не сказал бы что это супер здорово... Реально нужно не вырезать, а заменять Кроме того, регулярные выражения в этом плане тупее mshtml. Стоит ли говорить про стандартные "опечатки" внутри html которые IE понимает, и тд и тп. Автоматическое закрытие открытых тегов... и прочее. Потому хочется работать именно с распарсенной html-кой. Есть какие-нибудь идеи ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 14:05 |
|
||
|
IHTMLElement или что-то еще?!
|
|||
|---|---|---|---|
|
#18+
Gotdotnet.User.State happy = Inet.Google("Html2Xml | SgmlReader"); Допустим, HTML в XML мне перегонять совсем не надо Как c помощью SgmlReader прочитать весь текст, из примера в пред. посте, преобразовать текст (это я знаю , и затем (самое ВАЖНОЕ), засунуть его неместо ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 14:08 |
|
||
|
IHTMLElement или что-то еще?!
|
|||
|---|---|---|---|
|
#18+
Господа, всем спасибо! Ответ крылся в дебрях 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; } } } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 21:05 |
|
||
|
|

start [/forum/topic.php?fid=18&msg=33933415&tid=1390289]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
52ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 267ms |
| total: | 394ms |

| 0 / 0 |
