Сохранение HTML-документа
От: tonych  
Дата: 01.04.02 17:39
Оценка:
Проблемка...
Есть программа, которая открывает HTML-документ, показывает его (MFC — CHtmlView), получает интерфейс IHTMLDocument2 и с его помощью немного модифицирует документ. Теперь хотелось бы сохранить измененный HTML обратно в файл. Вопрос, как это сделать? Я не нашел ни одной подходящей функции....

Заранее благодарю за любую помощь.

Антон
Re: Сохранение HTML-документа
От: _DEBUG Беларусь  
Дата: 01.04.02 17:48
Оценка: 18 (1)
Здравствуйте tonych, Вы писали:

T>Проблемка...

T>Есть программа, которая открывает HTML-документ, показывает его (MFC — CHtmlView), получает интерфейс IHTMLDocument2 и с его помощью немного модифицирует документ. Теперь хотелось бы сохранить измененный HTML обратно в файл. Вопрос, как это сделать? Я не нашел ни одной подходящей функции....

T>Заранее благодарю за любую помощь.


HTML-документ можно сохранить так:

    CComQIPtr<IPersistFile> spFile = pDoc;
    if(spFile)
    {
         hr = spFile->Save(bstrPath,FALSE);
         // если поставишь TRUE будешь продолжать работу с уже обновленным документом
    }


если не подошло — есть еще несколько способов (например получить боди и затем сохранить аутер ХТМЛ)
\n Give me MSDN and I'll show you the world
Re[2]: Сохранение HTML-документа
От: tonych  
Дата: 02.04.02 05:33
Оценка:
Здравствуйте _DEBUG, Вы писали:

D>Здравствуйте tonych, Вы писали:


T>>Проблемка...

T>>Есть программа, которая открывает HTML-документ, показывает его (MFC — CHtmlView), получает интерфейс IHTMLDocument2 и с его помощью немного модифицирует документ. Теперь хотелось бы сохранить измененный HTML обратно в файл. Вопрос, как это сделать? Я не нашел ни одной подходящей функции....

T>>Заранее благодарю за любую помощь.


D>HTML-документ можно сохранить так:


D>
D>    CComQIPtr<IPersistFile> spFile = pDoc;
D>    if(spFile)
D>    {
D>         hr = spFile->Save(bstrPath,FALSE);
D>         // если поставишь TRUE будешь продолжать работу с уже обновленным документом
D>    }
D>


Спасибо, я так попробовал, и в результате сохранялись файлы нулевой длины :( Я правильно понимаю, что pDoc это указатель на интерфейс документа, который можно получить с помощью CHtmlView::GetHtmlDocument()? Кстати, spFile->GetCurFile() возвращает ожидаемый результат...

D>если не подошло — есть еще несколько способов (например получить боди и затем сохранить аутер ХТМЛ)


Я так раньше и делал, но такой способ работает неправильно. Например, если в документе есть

<script>document.write("<p>some text</p>");</script>

то в сохраненном документе получится

<script>document.write("<p>some text</p>");</script>
<P>some text</P>

и при его открытии мы увидим some text два раза.

Антон
Re[3]: Сохранение HTML-документа
От: _DEBUG Беларусь  
Дата: 02.04.02 07:03
Оценка: 8 (1)
Здравствуйте tonych, Вы писали:


T>Спасибо, я так попробовал, и в результате сохранялись файлы нулевой длины Я правильно понимаю, что pDoc это указатель на интерфейс документа, который можно получить с помощью CHtmlView::GetHtmlDocument()? Кстати, spFile->GetCurFile() возвращает ожидаемый результат...


сохраняется файл нулевой длинны потому что документ не полностью распарсен — т.е. перед тем как сохранять таким способом надо это проверить (например так):



    CComBSTR bstrState;
    hr = pDoc->get_readyState(&bstrState);
    if(FAILED(hr) || bstrState!=_T("complete"))
        return;
\n Give me MSDN and I'll show you the world
Re[4]: Сохранение HTML-документа
От: tonych  
Дата: 02.04.02 08:15
Оценка:
Здравствуйте _DEBUG, Вы писали:

D>Здравствуйте tonych, Вы писали:



T>>Спасибо, я так попробовал, и в результате сохранялись файлы нулевой длины :( Я правильно понимаю, что pDoc это указатель на интерфейс документа, который можно получить с помощью CHtmlView::GetHtmlDocument()? Кстати, spFile->GetCurFile() возвращает ожидаемый результат...


D>сохраняется файл нулевой длинны потому что документ не полностью распарсен — т.е. перед тем как сохранять таким способом надо это проверить (например так):



D>

D>    CComBSTR bstrState;
D>    hr = pDoc->get_readyState(&bstrState);
D>    if(FAILED(hr) || bstrState!=_T("complete"))
D>        return;
D>


Я не пробовал проверять именно таким способом, но сохранение происходит точно после OnNavigateComplete2, т.е документ был уже распарсен.

Антон
Re[5]: Сохранение HTML-документа
От: Zilog Россия  
Дата: 02.04.02 10:09
Оценка:
Здравствуйте tonych, Вы писали:

Поскипано...

T>Я не пробовал проверять именно таким способом, но сохранение происходит точно после OnNavigateComplete2, т.е документ был уже распарсен.


Хех, не обязательно, вот в OnDocumentComplete точно распарсен.
Don't work hard, work smart.
Re[6]: Сохранение HTML-документа
От: _DEBUG Беларусь  
Дата: 02.04.02 11:04
Оценка: 8 (1)
Здравствуйте Zilog, Вы писали:

Z>Здравствуйте tonych, Вы писали:


Z>Поскипано...


T>>Я не пробовал проверять именно таким способом, но сохранение происходит точно после OnNavigateComplete2, т.е документ был уже распарсен.


Z>Хех, не обязательно, вот в OnDocumentComplete точно распарсен.


Если документ содержит фреймы и всякую хрень наподобии скриптов — не обязательно после OnDocumentComplete у него State==_T("complete"). Поэтому надо проверять перед сохранением. А еще лучше сесть на евенты документа — и сохраняться когда его состояние изменилось на комплит
\n Give me MSDN and I'll show you the world
Re[7]: Сохранение HTML-документа
От: tonych  
Дата: 03.04.02 05:33
Оценка:
Здравствуйте _DEBUG, Вы писали:

Z>>Поскипано...


T>>>Я не пробовал проверять именно таким способом, но сохранение происходит точно после OnNavigateComplete2, т.е документ был уже распарсен.


Z>>Хех, не обязательно, вот в OnDocumentComplete точно распарсен.


D>Если документ содержит фреймы и всякую хрень наподобии скриптов — не обязательно после OnDocumentComplete у него State==_T("complete"). Поэтому надо проверять перед сохранением. А еще лучше сесть на евенты документа — и сохраняться когда его состояние изменилось на комплит


Я добавил проверку состояния перед сохранением, и get_readyState() всегда возвращает "complete".... Трудно ожидать другого, ведь сохранение инициируется пользователем, и потому после загрузки проходит приличное время. Еще одна интересная вещь: при сохранении нового файла spFile->Save() всегда завершается ошибкой (FAILED(hr)=TRUE), а при перезаписи существующего файла все как будто бы ок (SUCCEEDED(hr)=TRUE). Файлы нулевой длины получаеются в любом случае. Загадка...

Антон
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.