Générer un doctype avec du DOM
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.
<!DOCTYPE map PUBLIC "map.dtd" "http://www.company.com/dtds/map….
Tu trouves que c’est simple ? 13 lignes de code pour sortir une ligne de texte ! C’est bien JAVA çà ! 😉
Les 13 lignes de code ne servent pas toutes à générer le DOCTYPE. Cette section est générée avec seulement les deux lignes qui font appel à la méthode Transformer.setOutputProperty(). De plus, dans la plupart des cas, seule une des deux lignes est nécessaire.
Le Java peut se révéler très verbeux, mais je ne pense pas qu’ici ce soit le cas ! 🙂