L'objet DOMIplementation procure un ensemble de méthodes permettant de créer un document et une délaration de type de document. Etant donné qu'il n'est pas possible d'affecter une DTD à un objet DOMDocument déjà chargé, les méthodes createDocumentType() et createDocument() pallient à ce problème.
$impl = new DOMImplementation(); $dtd = $doc_xml->createDocumentType( 'html', '-//W3C//DTD XHTML 1.0 Strict//EN', 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'); $doc = $impl->createDocument( 'http://www.w3.org/1999/xhtml', 'html', $dtd);
En premier lieu, une instance de DOMImplementation doit être créée. Puis, à partir de l'objet obtenu, la méthode createDocumentType() construit une déclaration de type de document avec le nom de l'élément racine et éventuellement les identificateurs public et système. Ce dernier peut être un chemin vers une définition DTD locale. Enfin, un objet DOMDocument est conçu avec la méthode createDocument() à laquelle on spécifie l'bojet DOMDocumentType et éventuellement une URI d'espace de noms et un nom qualifié.
Finalement, il ne reste plus qu'à importer l'élément racine du document dénué de DTD, et l'ajouter dans le nouveau document XML.
<?php $fichier = 'societe'; $doc_xml = new DOMDocument(); if($doc_xml->load($fichier . '.xml')){ echo '<h3>Le document XML ' . $fichier . ' a été chargé !</h3>'; $impl = new DomImplementation(); $dtd = $impl->createDocumentType( $fichier, '', $fichier . '.dtd'); $doc = $impl->createDocument('', '',$dtd); $doc->version = '1.0'; $doc->encoding = 'ISO-8859-1'; $doc->standalone = 'no'; $doc->validateOnParse = true; $racine = $doc->importNode($doc_xml->documentElement, true); $doc->appendChild($racine); echo '<pre>' . str_replace('<', '<', $doc->saveXML()) . '</pre>'; if($doc->validate()) echo '<p>Le document XML est valide ' . 'par rapport à la DTD</p>'; } else echo '<p style="color:red">Le document XML ' . $fichier . ' n\'a pu être chargé !</p>'; ?> <?xml version="1.0" encoding="ISO-8859-1"?> <!-- Fichier : societe.xml --> <societe> <services> <service id="DG001"> <designation>Direction générale</designation> </service> <service id="ST001"> <designation>Service technique</designation> </service> <service id="SC001"> <designation>Service commercial</designation> </service> <service id="SC101"> <designation>Service clientèle</designation> </service> <service id="RH001"> <designation>Ressources humaines</designation> </service> <service id="SQ001"> <designation>Service qualité</designation> </service> <service id="SP001"> <designation>Service production</designation> </service> <service id="RD001"> <designation>Recherche et développement</designation> </service> </services> <divisions> <division id="A001" services="DG001 RH001"/> <division id="B001" services="SC001 SC101"/> <division id="C001" services="SP001 SQ001 RD001"/> </divisions> <employes> <employe id="RJ1002" service="DG001"> <nom>Robierre</nom> <prenom>Jean</prenom> </employe> <employe id="LA1012" service="DG001"> <nom>Lardut</nom> <prenom>Anne</prenom> </employe> <employe id="GA1013" service="ST001"> <nom>Guilde</nom> <prenom>Angelique</prenom> </employe> <employe id="HP1022" service="SC001"> <nom>Henry</nom> <prenom>Paul</prenom> </employe> <employe id="MM1045" service="RH001"> <nom>Mortier</nom> <prenom>Marc</prenom> </employe> <employe id="LS1102" service="SQ001"> <nom>Lebreton</nom> <prenom>Sophie</prenom> </employe> <employe id="JM1095" service="RD001"> <nom>Jolie</nom> <prenom>Martine</prenom> </employe> <employe id="MT1036" service="SC101"> <nom>Marcelin</nom> <prenom>Tania</prenom> </employe> <employe id="LL1029" service="SC101"> <nom>Leger</nom> <prenom>Laurence</prenom> </employe> <employe id="DM1052" service="SC001"> <nom>Duroi</nom> <prenom>Maxime</prenom> </employe> </employes> </societe> <?xml version="1.0" encoding="UTF-8"?> <!-- Fichier : societe.dtd --> <!ELEMENT designation (#PCDATA)> <!ELEMENT division EMPTY> <!ATTLIST division id ID #REQUIRED services IDREFS #REQUIRED > <!ELEMENT divisions (division+)> <!ELEMENT employe (nom, prenom)> <!ATTLIST employe id ID #REQUIRED service IDREF #REQUIRED > <!ELEMENT employes (employe+)> <!ELEMENT nom (#PCDATA)> <!ELEMENT prenom (#PCDATA)> <!ELEMENT service (designation)> <!ATTLIST service id ID #REQUIRED> <!ELEMENT services (service+)> <!ELEMENT societe (services, divisions, employes)>