在 php 中使用 XMLReader 进行许可验证

问题描述

我正在尝试对传入的 XML 文件进行一些非常基本的验证。我真的只需要知道是否有不匹配的标签或其他基本的语法错误。我预计某些生成 XML 的页面可能会超时并返回未完成的 XML,或者我什至可能无法获得 XML。我不在乎 DTD。如果没有 XML 声明,我什至不在乎。

我真正关心的是它是否可以被 DomDocument 解析。但由于 DomDocument 使用大量内存并且我正在处理大量大型 XML 文件,因此我更愿意使用 XMLReader 对其进行预验证。

为此我编写了以下函数:

public static function validateXML(string $path): bool
{
    $reader = new XMLReader();
    $reader->open($path);

    while ($reader->read()) {
        if ($reader->nodeType == XMLREADER::ELEMENT) {
            if (!$reader->isValid()) {
                echo "$reader->nodeType: $reader->name is invalid\n";
                return false;
            }
        }
    }

    return true;
}

然而这总是返回false。如果我在 while 循环之前添加以下行:

$reader->setParserProperty(XMLReader::VALIDATE,true);

如果有 DTD 并且文档根据该 DTD 是有效的,它将返回 true。但是大多数传入的文档都缺少 DTD,这太严格了。

我也试过只返回 $reader->open() 的结果,但这总是正确的(假设文件存在)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)