问题描述
我正在尝试对传入的 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 (将#修改为@)