Programmation Java/XML

Un livre de Wikilivres.

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 | modifier le wikicode]

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 | modifier le wikicode]

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 | modifier le wikicode]

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.