Надо написать html браузер |
Здравствуйте, гость ( Вход | Регистрация )
Надо написать html браузер |
Litkevich Yuriy |
19.11.2008, 11:55
Сообщение
#21
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
bynet, яб тебе всетаки рекомендовал использовать подход SAX, т.к. ты можешь использовать С++.
Т.е. ты создаешь класс SAX-парсера, передаешь ему файл, а он выпоняет поиск тэгов. Посмотри примеры Qt'явые по SAX'у. в наследнике своего SAX-парсера переопределяешь функции такого вида: openTag(QString tag, QString text) closeTag(QString tag) первая вызывается парсером, когда он обнаруживает открывающийся текст, и в нее парсер передает имя тэга "foo" (<foo>) и строку, которую он обнаружил от этого отрывающегося тэга до символа "<" вторая вызывается, когда парсер обнаружил закрывающийся тэг "bar" (</bar>). |
|
|
bynet |
19.11.2008, 12:38
Сообщение
#22
|
Студент Группа: Участник Сообщений: 69 Регистрация: 17.3.2008 Из: Belarus Пользователь №: 124 Спасибо сказали: 0 раз(а) Репутация: 0 |
Огромное спасибо, но мне минимум можно использовать стандартных функций. Все практически надо написать самому. Тоесть если строку парсить то надо написать свой парсер
|
|
|
AD |
19.11.2008, 13:09
Сообщение
#23
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
QString & QString::remove ( const QString & str, Qt::CaseSensitivity cs = Qt::CaseSensitive )
QString & QString::remove ( QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive ) Цитата QString & QString::remove ( const QString & str, Qt::CaseSensitivity cs = Qt::CaseSensitive ) This is an overloaded member function, provided for convenience. Removes every occurrence of the given str string in this string, and returns a reference to this string. If cs is Qt::CaseSensitive (the default), the search is case sensitive; otherwise the search is case insensitive. This is the same as replace(str, "", cs). See also replace(). QString & QString::remove ( QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive ) This is an overloaded member function, provided for convenience. Removes every occurrence of the character ch in this string, and returns a reference to this string. If cs is Qt::CaseSensitive (the default), the search is case sensitive; otherwise the search is case insensitive. Example: QString t = "Ali Baba"; t.remove(QChar('a'), Qt::CaseInsensitive); // t == "li Bb" This is the same as replace(ch, "", cs). QString & QString::replace ( const QString & before, const QString & after, Qt::CaseSensitivity cs = Qt::CaseSensitive ) Цитата QString & QString::replace ( const QString & before, const QString & after, Qt::CaseSensitivity cs = Qt::CaseSensitive )
This is an overloaded member function, provided for convenience. Replaces every occurrence of the string before with the string after. If cs is Qt::CaseSensitive (the default), the search is case sensitive; otherwise the search is case insensitive. Example: QString str = "colour behaviour flavour neighbour"; str.replace(QString("ou"), QString("o")); // str == "color behavior flavor neighbor" |
|
|
bynet |
19.11.2008, 16:09
Сообщение
#24
|
Студент Группа: Участник Сообщений: 69 Регистрация: 17.3.2008 Из: Belarus Пользователь №: 124 Спасибо сказали: 0 раз(а) Репутация: 0 |
Вот к чему я пришел
CODE void Parser::open() { QString szLine; QString absFileName = QFileDialog::getOpenFileName(this,"Open File","","HTML files (*.html;*.htm)"); QFile file(absFileName); if (file.open(QIODevice::ReadOnly)){ QTextStream out(&file); do { szLine = out.readLine(); htmltostr(szLine); //textEdit->(szLine); }while( !szLine.isNull()); } file.close(); } void Parser::htmltostr(QString& htmstr) { Сюда приходит строка которую мне надо обработать!!!!!!! } Для каждой строки, как я понимаю надо вытянуть тег и текст который находится между им. Может кто посоветует чего? |
|
|
fsMark |
19.11.2008, 16:55
Сообщение
#25
|
Студент Группа: Участник Сообщений: 97 Регистрация: 23.4.2008 Из: г. Киров Пользователь №: 155 Спасибо сказали: 10 раз(а) Репутация: 1 |
Помоему надо строить дерево отрожающее структуру HTML файла
Например: <HTML> текст <br> <b> жырный текст </b> снова текст </HTML> Пример такого простейшего дерева приведен в прикрепленном файле, потом ты будешь обходить это дерево и отображать его. Без такой древовидной структуры будет сложно учитывать вложенность тегов например для таблиц. Сообщение отредактировал fsMark - 19.11.2008, 17:00 |
|
|
trdm |
19.11.2008, 17:34
Сообщение
#26
|
Дмитрий Трошин Группа: Участник Сообщений: 575 Регистрация: 12.1.2008 Пользователь №: 68 Спасибо сказали: 21 раз(а) Репутация: 6 |
Как из строки asd <h1>qwe</h2> удалить к примеру <h1> чтобы строка стала asd qwe</h2> fgh QString.replace(); Месь, рекомендую покурить Ассистант. Он всегда поможет. Для каждой строки, как я понимаю надо вытянуть тег и текст который находится между им. Может кто посоветует чего? Поищите в интернете букварь по патернам, а в букваре поищите "рекурсивная композиция" или погуглите по "рекурсивная композиция/рекурсивный спуск". например тут: http://code.google.com/p/unnstudio/downloads/list http://ru.wikipedia.org/wiki/Метод_рекурсивного_спуска |
|
|
Litkevich Yuriy |
19.11.2008, 19:04
Сообщение
#27
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Помоему надо строить дерево отрожающее структуру HTML файла это DOM-подход, он сложен.Огромное спасибо, но мне минимум можно использовать стандартных функций. Все практически надо написать самому. Тоесть если строку парсить то надо написать свой парсер это я понял, я и предлагаю тебе свой парсер написать, но несквозной. А в стиле SAX, т.е. ты создаешь свой класс обзываешь его к примеру MySAX. Интерфейс выглядит примерно так:Интерфейс
В функции start(), собственно парсере, ты ищещ тэги (закрывающий и открывающий). Помере того как ты их находишь, вызываешь соответствующие методы. Например ты нашел открывающийся тэг, вызвал openTag(const QString &tag), в качестве аргумента передаешь имя тэга. Запоминашь позицию (номер символа)курсора сразу после тэга, ищешь слудющий тэг (или закрывающий или открывающий), когда нашел, то сначало берешь текст от запомненой позиции до текущей, передаешь его в text(const QString &text) затем вызываешь closeTag или openTag в зависимости от того какой тэг нашел. и т.д. А вот заготовка реализации: реализация
|
|
|
molchanoviv |
19.11.2008, 20:20
Сообщение
#28
|
Старейший участник Группа: Сомодератор Сообщений: 597 Регистрация: 18.7.2008 Из: Саратов Пользователь №: 238 Спасибо сказали: 41 раз(а) Репутация: 5 |
|
|
|
Текстовая версия | Сейчас: 21.12.2024, 15:36 |