Il existe dans Java deux packages permettant de manipuler les documents XML :

  • la manière SAX (Simple API for XML, navigation via un curseur) : une implémentation de l'interface org.xml.sax.helpers.DefaultHandler est notifiée de chaque balise lue. Aucune structure n'est construite en mémoire ;
  • et DOM (Document Object Model, navigation via un arbre) : une structure est construite au cours de la lecture, et peut être utilisée pour écrire un nouveau document XML.

Soit le document XML suivant :

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Documentation>
	<Site Wiki="Wikibooks">
		<Livre Wikilivre="Java">
			<Page1>Introduction</Page1>
			<Page2>Bases du langage</Page2>
			<Exemple>XML</Exemple>
		</Livre>
	</Site>
</Documentation>

Remarque : les espaces sont interdits dans les noms des balises car ils servent de séparateurs entre le nom et les attributs.

La méthode DOM modifier

Le programme suivant génère ce fichier XML dans le même répertoire :

import java.io.File;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;
 
public class XML_Creation_DOM
{
	public static void main(String argv[])
	{
		try
		{
			DocumentBuilderFactory XML_Fabrique_Constructeur = DocumentBuilderFactory.newInstance();
			DocumentBuilder XML_Constructeur = XML_Fabrique_Constructeur.newDocumentBuilder();

			Document XML_Document = XML_Constructeur.newDocument();
			Element documentation = XML_Document.createElement("Documentation");
			XML_Document.appendChild(documentation);

			Element site = XML_Document.createElement("Site");
			documentation.appendChild(site);
			Attr attribut1 = XML_Document.createAttribute("Wiki");
			attribut1.setValue("Wikibooks");
			site.setAttributeNode(attribut1);
		
			Element livre = XML_Document.createElement("Livre");
			site.appendChild(livre);
			Attr attribut2 = XML_Document.createAttribute("Wikilivre");
			attribut2.setValue("Java");
			livre.setAttributeNode(attribut2);

			Element page1 = XML_Document.createElement("Page1");
			page1.appendChild(XML_Document.createTextNode("Introduction"));
			livre.appendChild(page1);

			Element page2 = XML_Document.createElement("Page2");
			page2.appendChild(XML_Document.createTextNode("Bases du langage"));
			livre.appendChild(page2);		
 
			Element example = XML_Document.createElement("Exemple");
			example.appendChild(XML_Document.createTextNode("XML"));
			livre.appendChild(example);

			TransformerFactory XML_Fabrique_Transformeur = TransformerFactory.newInstance();
			Transformer XML_Transformeur = XML_Fabrique_Transformeur.newTransformer();
			DOMSource source = new DOMSource(XML_Document);
			StreamResult resultat = new StreamResult(new File("XML_résultat.xml"));
			XML_Transformeur.transform(source, resultat); 
			System.out.println("Le fichier XML a été généré !");
		}
		catch (ParserConfigurationException pce)
		{
			pce.printStackTrace();
		}
		catch (TransformerException tfe)
		{
			tfe.printStackTrace();
		}
	}
}

La méthode SAX modifier

Pour lire le fichier ci-dessus, il faut le parser avec un handler dont on redéfinit les méthodes :

import java.io.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import org.xml.sax.helpers.DefaultHandler;

public class XML_Creation_SAX
{
	public static void main(String[] args)
	{
		try
		{
			SAXParserFactory factory = SAXParserFactory.newInstance();
			SAXParser parser = factory.newSAXParser();
			parser.parse("XML_résultat.xml",
				new DefaultHandler()
				{
					public void startDocument() throws SAXException
					{ System.out.println("Début de document XML"); }
					public void endDocument() throws SAXException
					{ System.out.println("Fin de document XML"); }
					public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
					{ System.out.println("Début d'élément : " + qName); }
					public void endElement(String uri, String localName, String qName) throws SAXException
					{ System.out.println("Fin d'élément : " + qName); }
					public void characters(char[] ch, int start, int length) throws SAXException
					{ System.out.println("Caractère lus dans un élémént"); }
				}
			);  
		}
		catch (IOException e)
		{
			System.err.println("Erreur de lecture : "+e);
			System.exit(1);
		}
		catch (SAXException e)
		{
			System.err.println("Erreur d'interprétation : "+e);
			System.exit(1);
		}
		catch (ParserConfigurationException e)
		{
			System.err.println("Pas d'interpréteur SAX pour la configuration demandée : "+e);
			System.exit(1);
		}
	}
}

La méthode JDOM modifier

JDOM utilise les deux bibliothèques précédentes. Si l'erreur suivante survient : error: package org.jdom does not exist, il suffit de télécharger la bibliothèque. Pour utilise la version 2, remplacer les import org.jdom par des import org.jdom2.