注: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原来的,和DOMDocument对象的doctype
属性是只读的,所以你必须复制根节点(与它的一切)到一个新的DOM文档。
我只是刚刚与这个我自己去,所以我不完全确定这是否涵盖了所有内容,但它在我的示例中绝对适用于XML。
当然,快速和肮脏的解决方案是首先将XML作为字符串获取,然后通过自己的DTD搜索并替换原始的DTD,然后加载它。
你能你的DTD添加到目标XML。用你的DTD创建一个空文档,然后将你的目标XML加载到空文档中 – rojoca 2009-08-13 20:43:04