libxml htmlParseDocument игнорируя флаги htmlParseOption

Ищите того, кто использует libxml в среде, отличной от PHP, для подтверждения того, что флаг HTML_PARSE_NOWARNING игнорируется.
Предупреждения все еще генерируются.

Исходный код из PHP, реализующий libxml на C:

//one of these options is 64 or HTML_PARSE_NOWARNING
htmlCtxtUseOptions(ctxt, (int)options);

ctxt->vctxt.error = php_libxml_ctx_error;
ctxt->vctxt.warning = php_libxml_ctx_warning;
if (ctxt->sax != NULL) {
ctxt->sax->error = php_libxml_ctx_error;
ctxt->sax->warning = php_libxml_ctx_warning;
}
htmlParseDocument(ctxt); //this still produces warnings

1

Решение

libxml2 не игнорирует HTML_PARSE_NOWARNING флаг. призвание htmlCtxtUseOptions с HTML_PARSE_NOWARNING вызывает отмену регистрации обработчиков предупреждений (устанавливается в NULL). Но затем PHP-код безоговорочно переходит к установке собственных обработчиков, делая флаг бесполезным. Код PHP должен добавить проверку, устанавливать ли обработчики:

htmlCtxtUseOptions(ctxt, (int)options);

if (!(options & HTML_PARSE_NOERROR)) {
ctxt->vctxt.error = php_libxml_ctx_error;
if (ctxt->sax != NULL)
ctxt->sax->error = php_libxml_ctx_error;
}
if (!(options & HTML_PARSE_NOWARNING)) {
ctxt->vctxt.warning = php_libxml_ctx_warning;
if (ctxt->sax != NULL)
ctxt->sax->warning = php_libxml_ctx_warning;
}
htmlParseDocument(ctxt);

Или позвоните по телефону htmlCtxtUseOptions после настройки обработчиков:

ctxt->vctxt.error = php_libxml_ctx_error;
ctxt->vctxt.warning = php_libxml_ctx_warning;
if (ctxt->sax != NULL) {
ctxt->sax->error = php_libxml_ctx_error;
ctxt->sax->warning = php_libxml_ctx_warning;
}

htmlCtxtUseOptions(ctxt, (int)options);
htmlParseDocument(ctxt);
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]