【问题标题】:libxml htmlParseDocument ignoring htmlParseOption flagslibxml htmlParseDocument 忽略 htmlParseOption 标志
【发布时间】:2017-01-25 20:05:39
【问题描述】:

寻找通过 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

【问题讨论】:

    标签: php libxml2


    【解决方案1】:

    libxml2 不会忽略 HTML_PARSE_NOWARNING 标志。用HTML_PARSE_NOWARNING 调用htmlCtxtUseOptions 会导致警告处理程序被注销(设置为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);
    

    【讨论】:

    • 好消息是修复很容易。还是很可惜,它需要修补 PHP 的源代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 2020-02-11
    • 2021-01-27
    • 1970-01-01
    • 2015-12-28
    相关资源
    最近更新 更多