libxml htmlParseDocument忽略htmlParseOption标志

时间:2017-01-25 20:05:40

标签: php libxml2

正在寻找通过除PHP打包之外的环境使用libxml来确认HTML_PARSE_NOWARNING标志的人。 警告仍然生成。

PHP的源代码,在C:中实现libxml

//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 个答案:

答案 0 :(得分:2)

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);