【问题标题】:Avoid DOMDocument XML warnings in php避免 php 中的 DOMDocument XML 警告
【发布时间】:2011-08-16 17:30:57
【问题描述】:

我正在从服务器获取 xml 文件,有时我得到一个无效的 xml 文件,因此我收到了警告:

Warning: DOMDocument::load() [domdocument.load]: Start tag expected, '<' not found in 

我怎样才能捕捉到这个警告并删除文件?

【问题讨论】:

标签: php warnings


【解决方案1】:

你有两个选择。在您的 load() 调用中使用 @ 错误控制运算符,例如@$dom-&gt;load(),有点慢,因为它将 display_errors 的值全局更改为 off,执行函数并将其设置回 on。

我个人更喜欢的另一个选项(我讨厌@ 运算符,我无法忍受在我的代码中看到它)是保存libxml_use_internal_errors 的旧值,使用libxml_use_internal_errors(TRUE) 启用它,调用该函数,清除错误缓冲区并恢复旧值。这是我的代码中的一个 sn-p:

<?php
$previous_value = libxml_use_internal_errors(TRUE);
$doc->loadHTML((string)$e->response->getBody());
libxml_clear_errors();
libxml_use_internal_errors($previous_value);

我还不能评论答案,所以我会写在这里:

  • Michael 解决方案使其不那么严格,但仍会针对某些错误发出警告:
nadav@shesek:~$ php -r '$dom=new DOMDocument; $dom->strictErrorChecking = FALSE ; $dom->loadHTML("");' PHP 警告:DOMDocument::loadHTML(): Tag xy 在实体中无效,行:第 1 行命令行代码中的 1
  • 不要按照 Fran Verona 的建议去做 - 全局禁用错误报告是您永远不应该做的事情。在生产中,设置您自己的错误处理程序并向用户显示更漂亮的消息,并确保错误记录在某处 - 但永远不要完全禁用它。将 error_reporting 设置为 0 会导致 PHP 也禁用错误日志记录。
  • Xeon06 解决方案存在问题,因为您正在影响特定代码段的整个脚本错误处理程序。使用您自己的错误处理程序只是忽略错误会导致与 Fran 的解决方案相同的问题。

【讨论】:

    【解决方案2】:

    使用set_error_handler

    set_error_handler("yourHandler", E_WARNING);
    

    【讨论】:

    • 并在验证 XML 文件后使用 restore_error_handler()。
    • 确实,感谢编辑,我已经习惯了编写 JS 函数 :)
    【解决方案3】:

    关闭严格的错误检查:

    $dom = new DOMDocument();
    $dom->strictErrorChecking = FALSE ;
    
    $dom->load('/path/to/file.xml');
    if (!$dom->validate()) {
       // Invalid XML!
    }
    

    【讨论】:

    • 我如何知道 xml 是否有效?如果我收到此警告,我想删除文件并重新下载...
    • @iUngi 见上面的补充DOMDocument::validate()
    猜你喜欢
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 2016-12-25
    • 2021-02-04
    相关资源
    最近更新 更多