【问题标题】:Using DOMDocument Validate() on XML Causes Infinite Load在 XML 上使用 DOMDocument Validate() 会导致无限加载
【发布时间】:2017-02-26 10:07:50
【问题描述】:

我有一个非常简单的实现,它引入了 XML 的测试位并尝试使用 DOMDocument 对其进行验证。在测试中,它能够很好地通过 LoadHTML() 调用,但是一旦我尝试运行 validate(),浏览器就会永远挂起并且不会加载。代码如下:

$content = '<?xml version="1.0" encoding="utf-8"?><mainElement></mainElement>';

$dom = new DOMDocument;
$dom->LoadHTML($content);

if (!$dom->validate()) {
    echo 'fail';
} else {
    echo 'success!';
}

【问题讨论】:

  • 那么你为什么要用loadHTML而不是loadXML来解析XML?

标签: php xml domdocument


【解决方案1】:

似乎如果你想验证用loadHTML 加载的内容,你需要DOCTYPE declaration(没有它,你会得到一个不定式循环)。例如,以下代码工作并打印fail

$content = "
    <!DOCTYPE html>
    <html>
    <body>
    Content of the document......
    </body>
    </html>
";

$dom = new DOMDocument();
$dom->loadHTML($content);

if (!$dom->validate()) {
    echo 'fail';
} else {
    echo 'success!';
}

对于 XML,它更宽容(即使您没有声明 dtd,它也可以工作,但它返回 false)。在您的情况下,您可以使用loadXML 方法,您的代码将打印fail

php 7.0.13测试。

【讨论】:

  • 这是有道理的,我已经按照建议切换到使用 loadXML 并且现在得到“失败”。不过,我很好奇,为什么这无法验证?我期待着重新获得成功。
  • @carbide20 它失败了,因为你没有指定dtd。验证是检查您的 xml 是否基于您的dtd 的过程。签出w3schools.com/xml/xml_dtd.asp
  • 现在我明白了,感谢您解释这一点并花时间回答!
猜你喜欢
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
相关资源
最近更新 更多