Convalida XML contro DTD dato in PHP

In PHP, sto provando a validationre un documento XML usando un DTD specificato dalla mia applicazione, non dal documento XML recuperato esternamente. Il metodo di validation nella class DOMDocument sembra validationre solo utilizzando la DTD specificata dal documento XML stesso, quindi questo non functionrà.

Questo può essere fatto, e come, o devo tradurre il mio DTD in uno schema XML, così posso usare il metodo schemaValidate?

(sembra che sia stato chiesto in Validate XML usando una DTD personalizzata in PHP ma senza una risposta corretta, poiché la soluzione si basa solo sulla DTD specificata dall'XML di destinazione)

Nota: la validation XML potrebbe essere soggetta all'attacco di Billion Laughs e a vettori simili di DoS.

Questo essenzialmente fa quello che Rojoca ha menzionato nel suo commento:

<?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(); ?> 

Ciò convaliderà il documento contro bar.dtd .

Non puoi semplicemente call $new->loadXML() , perché sarebbe sufficiente impostare la DTD sull'originale e la properties; doctype di un object DOMDocument è di sola lettura, quindi devi copiare il nodo root (con tutto it) a un nuovo documento DOM.

Ho appena avuto un tentativo con questo me stesso, quindi non sono del tutto sicuro se questo copre tutto, ma sicuramente funziona per l'XML nel mio esempio.

Ovviamente, la soluzione rapida sarebbe quella di get prima XML come string, cercare e sostituire il DTD originale con il proprio DTD e quindi caricarlo.

Penso che sia ansible solo con XSD, vedi:
http://php.net/manual/en/domdocument.schemavalidate#62032