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 !");
Caractéristique Version Spécification
XML 1.0 Document Object Model (Core) Level 1
Core 1.0 Document Object Model (Core) Level 1
HTML 1.0 Document Object Model (HTML) Level 1
XML 2.0 Document Object Model Level 2 Core
Core 2.0 Document Object Model Level 2 Core
HTML 2.0 Document Object Model HTML
Views 2.0 Document Object Model Views
Events 2.0 Document Object Model Events
StyleSheets 2.0 Document Object Model Style Sheets
CSS 2.0 Document Object Model CSS
Traversal 2.0 Document Object Model Traversal
Range 2.0 Document Object Model Range
XML 3.0 Document Object Model Level 3 Core
Core 3.0 Document Object Model Level 3 Core
LS 3.0 Document Object Model Load and Save
LS-Async 3.0 Document Object Model Load and Save
Validation 3.0 Document Object Model Validation
xpath 3.0 Document Object Model XPath
Events 3.0 Document Object Model Level 3 Events
AS-READ 3.0 Abstract Schemas Object Model for Read
AS-EDIT 3.0 Abstract Schemas Object Model for Editing
AS-DOC 3.0 Abstract Schemas Object Model for Document Editing
ViewsAndFormatting   Document Object Model Views and Formatting (Generic)
VisualViewsAndFormatting   Document Object Model Views and Formatting (Visual properties)
org.w3c.dom.mathml   Mathematical Markup Language Version 2.0
org.w3c.svg   SVG 1.0
org.w3c.dom.svg   SVG DOM
TimeControl   SMIL Animation
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)>