Это - жесткая проблема, и необходимо будет узнать эту информацию с помощью статического анализа, не доступный легко во времени выполнения. В основном получите путь к классу своего приложения и сканирования через доступные классы и считайте информацию о байт-коде класса, какому классу это наследовалось. Обратите внимание, что класс Собака не может непосредственно наследоваться Животному, но мог бы наследоваться Домашнему животному, которое является поворотом, наследовался Животному, таким образом, необходимо будет отслеживать ту иерархию.
Примечание: XML-валидация может быть объектом атаки 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 в исходное значение, а свойство doctype
объекта DOMDocument доступно только для чтения, поэтому вам нужно скопировать корневой узел (со всем в нем) в новый документ DOM.
I только что сам попробовал это сделать, поэтому я не совсем уверен, все ли это покрывает, но это определенно работает для XML в моем примере.
Конечно, быстрое и грязное решение было бы сначала получить XML в виде строки,найдите и замените исходное DTD своим собственным, а затем загрузите его.
Я думаю, что это возможно только с XSD, см .:
http://php.net/manual/en/domdocument.schemavalidate#62032