Цитата(fsMark @ 19.11.2008, 19:55)

Помоему надо строить дерево отрожающее структуру HTML файла
это DOM-подход, он сложен.
Цитата(bynet @ 19.11.2008, 15:38)

Огромное спасибо, но мне минимум можно использовать стандартных функций. Все практически надо написать самому. Тоесть если строку парсить то надо написать свой парсер
это я понял, я и предлагаю тебе свой парсер написать, но несквозной. А в стиле SAX, т.е. ты создаешь свой класс обзываешь его к примеру MySAX. Интерфейс выглядит примерно так:
#ifndef MYSAX_H
#define MYSAX_H
class QString;
class QFile;
/*! SAX парсер.
*/
class MySAX
{
public:
MySAX();
~MySAX();
/*! Загрузчик.
*
* Загружает файл в память и вызывает приватный метод start(), для анализа.
*
* \param file - файл для разбора.
* \return false - если неудалось загрузить файл или он неправильный.
*/
bool load(const QFile &file);
/*! Обработчик открывающегося тэга.
* \param tag - имя тэга.
* \param text - текст следующий за тэгом (до символа "<").
* \return false - если необходимо прервать анализ.
*/
virtual bool openTag(const QString &tag);
/*! Обработчик текста в нутри тэга.
* \param text - текст следующий за тэгом (до символа "<").
* \return false - если необходимо прервать анализ.
*/
virtual bool text(const QString &text);
/*! Обработчик закрывающегося тэга.
* \param tag - имя тэга.
* \return false - если необходимо прервать анализ.
*/
virtual bool closeTag(const QString& tag);
private:
/*! Сам синтаксический анализатор.
*/
void start();
int old_pos;
};
#endif //MYSAX_H
В функции start(), собственно парсере, ты ищещ тэги (закрывающий и открывающий).
Помере того как ты их находишь, вызываешь соответствующие методы. Например ты нашел открывающийся тэг, вызвал
openTag(const QString &tag), в качестве аргумента передаешь имя тэга. Запоминашь позицию (номер символа)курсора сразу после тэга, ищешь слудющий тэг (или закрывающий или открывающий), когда нашел, то сначало берешь текст от запомненой позиции до текущей, передаешь его в
text(const QString &text) затем вызываешь
closeTag или
openTag в зависимости от того какой тэг нашел. и т.д.
А вот заготовка реализации:
MySAX::MySAX()
{
}
MySAX::~MySAX()
{
}
bool MySAX::load(const QFile &file)
{
if (!file.open(QIODevice::ReadOnly))
{
qDebug() << "Error: file " << file.fileName() << "is absent";
return false;
}
qDebug() << "Open file: " << file.fileName();
...
...
...
}
bool MySAX::openTag(const QString &tag)
{
qDebug() << "Open tag: " << tag;
}
bool MySAX::text(const QString &text)
{
qDebug() << "\tIn tag text: " << text;
}
bool MySAX::closeTag(const QString &tag)
{
qDebug() << "Close tag: " << tag;
}
void MySAX::start()
{
QString otag, ctag, text;
// анализируем
while(/*пока файл некончился*/)
{
...
// Нашли открывающийся тэг
if (!openTag(otag))
return;
...
// Нашли закрывающийся тэг
// читаем текст от старой позиции до новой
text = ...;
if (!text(text))
return;
if (!closeTag(ctag))
return;
}
}