Le DOCTYPE est souvent oublié, pourtant parfois il se révèle indispensable. Mais comment générer cette section dans un document XML avec du DOM en Java ?

Pour rappel, le DOCTYPE permet de spécifier dans un  XML la définition du type de document (ie. le format utilisé)[1].

Il est peu souvent utilisé lors de la génération de document XML. De plus la documentation de l’API DOM n’est pas forcément explicite. Du coup certaines personnes peuvent rencontrer quelques problèmes pour le générer.

Voici un exemple très simple en Java qui ajoute la section DOCTYPE à un fichier XML existant :

try {
 //Load XML file
 Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("src.xml");
 // Create a transformer
 Transformer xformer = TransformerFactory.newInstance().newTransformer();
 // Set the public and system id
 xformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "map.dtd");
 xformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "http://www.company.com/dtds/map.dtd");
 // Write the DOM document to a file
 Source source = new DOMSource(doc);
 Result result = new StreamResult(new File("dst.xml"));
 xformer.transform(source, result);
} catch (TransformerConfigurationException e) {
} catch (TransformerException e) {
} catch (IOException e) {
} catch (ParserConfigurationException e) {
} catch (SAXException e) { }

Le fichier source XML nommé src.xml :

<?xml version="1.0" encoding="UTF-8"?>
<map>
 <entry key="key1" value="value1" />
 <entry key="key2" />
</map>

Le fichier déstination obtenu nommé dst.xml :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE map PUBLIC "map.dtd" "http://www.company.com/dtds/map.dtd">
<map>
 <entry key="key1" value="value1" />
 <entry key="key2"/>
</map>

Vraiment simple non ? Maintenant, vous n’aurez plus d’excuse pour ne pas spécifier le DOCTYPE dans les documents XML que vous générerez. 😉

Notes

[1] Par exemple au travers d’une DTD ou d’un XSD.