php - 针对 PHP 中给定 DTD 的 XML 验证

标签 php xml validation dtd

在 PHP 中,我尝试使用我的应用程序指定的 DTD 来验证 XML 文档,而不是通过外部获取的 XML 文档。 DOMDocument 类中的验证方法似乎只使用 XML 文档本身指定的 DTD 进行验证,因此这将不起作用。

可以这样做吗?我必须如何将 DTD 转换为 XML 模式,以便使用 schemaValidate 方法?

(这似乎在 Validate XML using a custom DTD in PHP 中被问过,但没有正确答案,因为该解决方案仅依赖于目标 XML 指定的 DTD)

最佳答案

备注:XML validation可能受制于 Billion Laughs攻击和类似的 DoS 载体。

这基本上完成了 rojoca 在他的评论中提到的内容:

<?php

$xml = <<<END
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE foo SYSTEM "foo.dtd">
<foo>
    <bar>baz</bar>
</foo>
END;

$root = 'foo';

$old = new DOMDocument;
$old->loadXML($xml);

$creator = new DOMImplementation;
$doctype = $creator->createDocumentType($root, null, 'bar.dtd');
$new = $creator->createDocument(null, null, $doctype);
$new->encoding = "utf-8";

$oldNode = $old->getElementsByTagName($root)->item(0);
$newNode = $new->importNode($oldNode, true);
$new->appendChild($newNode);

$new->validate();

?>

这将根据 bar.dtd 验证文档。

您不能只调用 $new->loadXML(),因为那样只会将 DTD 设置为原始 DTD,以及 DOMDocument 对象的 doctype 属性是只读的,因此您必须将根节点(以及其中的所有内容)复制到新的 DOM 文档。

我自己只是尝试了一下,所以我不完全确定这是否涵盖了所有内容,但它绝对适用于我示例中的 XML。

当然,快速而肮脏的解决方案是首先将 XML 作为字符串获取,搜索并用您自己的 DTD 替换原始 DTD,然后加载它。

关于php - 针对 PHP 中给定 DTD 的 XML 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1274173/

相关文章:

asp.net - VB.NET-ASP.NET-不正确的用户名/密码(验证)

php - Mysql PDO 中 "RETURNING"子句的语法

xml - 在 Excel 中使用 XML

xml - 从 XML 资源创建 hashmap/map

sql-server - Tsql 从表创建 Xml

javascript - 验证 HTML 表单中不能同名的多个复选框

javascript - php验证失败后跳转到特定id

php - apache2 + MPM-ITK + PHP = 套接字不起作用

java - 术语 : "Entity Bean" vs. "Data Model"

javascript - 设置表单提交后的表单操作 jQuery