Здравствуйте tonych, Вы писали:
T>Проблемка... T>Есть программа, которая открывает HTML-документ, показывает его (MFC — CHtmlView), получает интерфейс IHTMLDocument2 и с его помощью немного модифицирует документ. Теперь хотелось бы сохранить измененный HTML обратно в файл. Вопрос, как это сделать? Я не нашел ни одной подходящей функции....
T>Заранее благодарю за любую помощь.
HTML-документ можно сохранить так:
CComQIPtr<IPersistFile> spFile = pDoc;
if(spFile)
{
hr = spFile->Save(bstrPath,FALSE);
// если поставишь TRUE будешь продолжать работу с уже обновленным документом
}
если не подошло — есть еще несколько способов (например получить боди и затем сохранить аутер ХТМЛ)
T>Спасибо, я так попробовал, и в результате сохранялись файлы нулевой длины Я правильно понимаю, что pDoc это указатель на интерфейс документа, который можно получить с помощью CHtmlView::GetHtmlDocument()? Кстати, spFile->GetCurFile() возвращает ожидаемый результат...
сохраняется файл нулевой длинны потому что документ не полностью распарсен — т.е. перед тем как сохранять таким способом надо это проверить (например так):
Здравствуйте Zilog, Вы писали:
Z>Здравствуйте tonych, Вы писали:
Z>Поскипано...
T>>Я не пробовал проверять именно таким способом, но сохранение происходит точно после OnNavigateComplete2, т.е документ был уже распарсен.
Z>Хех, не обязательно, вот в OnDocumentComplete точно распарсен.
Если документ содержит фреймы и всякую хрень наподобии скриптов — не обязательно после OnDocumentComplete у него State==_T("complete"). Поэтому надо проверять перед сохранением. А еще лучше сесть на евенты документа — и сохраняться когда его состояние изменилось на комплит
Проблемка...
Есть программа, которая открывает HTML-документ, показывает его (MFC — CHtmlView), получает интерфейс IHTMLDocument2 и с его помощью немного модифицирует документ. Теперь хотелось бы сохранить измененный HTML обратно в файл. Вопрос, как это сделать? Я не нашел ни одной подходящей функции....
Здравствуйте _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>если не подошло — есть еще несколько способов (например получить боди и затем сохранить аутер ХТМЛ)
Я так раньше и делал, но такой способ работает неправильно. Например, если в документе есть
Здравствуйте _DEBUG, Вы писали:
D>Здравствуйте tonych, Вы писали:
T>>Спасибо, я так попробовал, и в результате сохранялись файлы нулевой длины :( Я правильно понимаю, что pDoc это указатель на интерфейс документа, который можно получить с помощью CHtmlView::GetHtmlDocument()? Кстати, spFile->GetCurFile() возвращает ожидаемый результат...
D>сохраняется файл нулевой длинны потому что документ не полностью распарсен — т.е. перед тем как сохранять таким способом надо это проверить (например так):
Поскипано...
T>Я не пробовал проверять именно таким способом, но сохранение происходит точно после OnNavigateComplete2, т.е документ был уже распарсен.
Хех, не обязательно, вот в OnDocumentComplete точно распарсен.
Здравствуйте _DEBUG, Вы писали:
Z>>Поскипано...
T>>>Я не пробовал проверять именно таким способом, но сохранение происходит точно после OnNavigateComplete2, т.е документ был уже распарсен.
Z>>Хех, не обязательно, вот в OnDocumentComplete точно распарсен.
D>Если документ содержит фреймы и всякую хрень наподобии скриптов — не обязательно после OnDocumentComplete у него State==_T("complete"). Поэтому надо проверять перед сохранением. А еще лучше сесть на евенты документа — и сохраняться когда его состояние изменилось на комплит
Я добавил проверку состояния перед сохранением, и get_readyState() всегда возвращает "complete".... Трудно ожидать другого, ведь сохранение инициируется пользователем, и потому после загрузки проходит приличное время. Еще одна интересная вещь: при сохранении нового файла spFile->Save() всегда завершается ошибкой (FAILED(hr)=TRUE), а при перезаписи существующего файла все как будто бы ок (SUCCEEDED(hr)=TRUE). Файлы нулевой длины получаеются в любом случае. Загадка...