L'objet DOMIplementation fournit un ensemble de méthodes permettant de créer un document et une délaration de type de document.
Les objets obtenus par les méthodes createDocumentType() et createDocument() sont indépendants de n'importe quelles instances particulières du modèle d'objet de document.
DOMImplementation impl = document.getImplementation(); DocumentType dtd = impl.createDocumentType( "html", "-//W3C//DTD XHTML 1.0 Strict//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"); Document doc = impl.createDocument( "http://www.w3.org/1999/xhtml", "html", dtd);
Un document créé par la méthode newDocument() de la classe DocumentBuilder, ne possède pas d'élément racine entraînant donc une malformation initiale. La méthode createDocument() indique dès la conception l'élément racine indispensable pour obtenir un document bien-formé, mais en plus peut être valide grâce aux identificateurs PUBLIC et SYSTEM. L'emploi de cette alternative à DocumentBuilder paraît une solution plus appropriée pour la création d'un nouveau document XML.
Deux autres méthodes permettent d'accéder à un objet implémentant l'API spécialisée d'une caractéristique DOM et de sa version ou de vérifier si elles sont implémentées par l'implémentation courante. Ces caractéristiques portent un nom et un numéro de version qui ne peut être que 1.0 pour DOM Level 1 Specification, 2.0 pour DOM Level 2 Core Specification et 3.0 pour DOM Level 3 Core Specification
Object resultat = doc.getFeature("Core", "2.0); if(doc.hasFeature("Events", "2.0")) System.out.println("La caractéristique est supportée !");
import org.w3c.dom.DOMImplementation; public class Caracteristiques { private static String[][] caracteristiques = {{"XML", "1.0"}, {"Core", "1.0"}, {"HTML", "1.0"}, {"XML", "2.0"}, {"Core", "2.0"}, {"HTML", "2.0"}, {"Views", "2.0"}, {"Events", "2.0"}, {"StyleSheets", "2.0"} {"CSS", "2.0"}, {"Traversal", "2.0"}, {"Range", "2.0"}, {"XML", "3.0"}, {"Core", "3.0"}, {"LS", "3.0"}, {"LS-Async", "3.0"}, {"Validation", "3.0"}, {"xpath", "3.0"}, {"Events", "3.0"}, {"AS-READ", "3.0"}, {"AS-EDIT", "3.0"}, {"AS-DOC", "3.0"}}; public static void main(String args[]){ DOMImplementation implDOM = DOMImplementationImpl.getDOMImplementation(); for (int i = 0; i < caracteristiques.length; i++){ System.out.print(caracteristiques[i][0] + " " + caracteristiques[i][1] +" : "); if(implDOM.hasFeature( caracteristiques[i][0], caracteristiques[i][1])) System.out.println("supportée"); else System.err.println("non-supportée"); } } }
La classe DOMImplementationRegistry constitue une fabrique d'objets DOMImplementation. Dans le but d'obtenir une implémentation DOM personnalisées, il suffit d'invoquer la méthode getDOMImplementation() et de lui passer une liste des caractéristiques devant être supportées par l'objet DOMImplementation retourné. La liste possède des noms de caractéristiques avec leur numéro de version, séparés par des espaces.
DOMImplementationRegistry enregistreur = DOMImplementationRegistry.newInstance(); //Implémentation DOM supportant XML 3.0 DOMImplementation implDOM3 = enregistreur.getDOMImplementation("XML 3.0"); //Implémentation DOM supportant XML 1.0 Traversal et Events 2.0 DOMImplementation implDOM = enregistreur.getDOMImplementation( "XML 1.0 Traversal Events 2.0");
La vérification du support de caractéristiques particulières par une implémentation, s'effectue par le truchement de la méthode hasFeature(), à laquelle il faut spécifier le nom de la caractéristique et sa version.
DOMImplementationRegistry enregistreur = DOMImplementationRegistry.newInstance(); DOMImplementation implDOM3 = enregistreur.getDOMImplementation("XML 3.0"); if(implDOM3.hasFeature("LS", "3.0")) System.out.println( "L'implémentation supporte l'API DOM Level 3 Load and Save.");
Etant donné qu'il n'est pas possible de créer une DTD, et partant, d'en affecter une à un objet Document déjà chargé, les méthodes createDocumentType() et createDocument() pallient à ce problème. L'utilisation directe de l'implémentation DOM sous-jacente, telle que Xerces, peut également résoudre ce problème. En effet, la classe org.apache.xerces.dom.CoreDocumentImpl possède une méthode createDocumentType().
En premier lieu, une instance de DOMImplementation doit être obtenue. Puis, à partir de cet objet, 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 Document est conçu avec la méthode createDocument() à laquelle on spécifie l'objet DocumentType et éventuellement une adresse 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.
public class Programme { public static void main(String[] args){ String fichier = "societe"; DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance(); DocumentBuilder analyseur = fabrique.newDocumentBuilder(); Document doc_xml = analyseur.parse(new File(fichier + ".xml")); System.out.println("Le document XML " + fichier + " a été chargé !"; DomImplementation impl = document.getImplementation(); Documentype dtd = impl.createDocumentType( fichier, "", fichier + ".dtd"); Document doc = impl.createDocument(fichier, "",dtd); doc.setXmlVersion("1.0"); doc.setXmlEncoding("ISO-8859-1"); doc.setXmlStandalone("no"); doc.setValidating(true); Node racine = doc.importNode(doc.getDocumentElement(), true); doc.appendChild(racine); } } <?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="ISO-8859-1"?> <!-- 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)>