避免 php 中的 DOMDocument XML 警告

发布于 2024-11-29 21:42:17 字数 185 浏览 0 评论 0原文

我从服务器获取 xml 文件,有时我收到无效的 xml 文件,因此我收到警告:

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

如何捕获此警告并删除该文件?

I'm fetching xml files from a server and sometimes I'm getting a non-valid xml files, because of this I'm getting a warning:

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

How can I catch this warning and delete the file?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

百善笑为先 2024-12-06 21:42:17

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

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

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

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

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

You have two choices. Either use the @ error control operator in your load() call, e.g. @$dom->load(), which is somewhat slow because it globally changes the value of display_errors to off, executes the function and sets it back to on.

The other option, which I personally prefer (I hate the @ operator, I can't stand to see it in my code) is to save the old value of libxml_use_internal_errors, enable it using libxml_use_internal_errors(TRUE), call the function, clear the errors buffer and restore the old value. Here's a snippet from my code that does that:

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

I can't comment on answers yet, so I'll write it here:

  • Michael solution makes it less strict, but it'll still issue warnings for some of the errors:
nadav@shesek:~$ php -r '$dom=new DOMDocument; $dom->strictErrorChecking = FALSE ; $dom->loadHTML("<xy></zx>");'
PHP Warning:  DOMDocument::loadHTML(): Tag xy invalid in Entity, line: 1 in Command line code on line 1
  • DON'T do what Fran Verona suggested - globally disabling error reporting is something you should never do. In production, set your own error handler and display a prettier message to the user, and make sure the error is logged somewhere - but never disable it completely. Setting error_reporting to 0 will cause PHP to disable error logging too.
  • Xeon06 solution is problematic because you're effecting the entire script error handler for a specific piece of code. Using your own error handler that simply ignores the error causes the same issues as Fran's solution.
时间海 2024-12-06 21:42:17

使用 set_error_handler

set_error_handler("yourHandler", E_WARNING);

Use set_error_handler.

set_error_handler("yourHandler", E_WARNING);
掩于岁月 2024-12-06 21:42:17

关闭严格的错误检查:

$dom = new DOMDocument();
$dom->strictErrorChecking = FALSE ;

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

Turn off strict error checking:

$dom = new DOMDocument();
$dom->strictErrorChecking = FALSE ;

$dom->load('/path/to/file.xml');
if (!$dom->validate()) {
   // Invalid XML!
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文