Programmation Java/XML
Apparence
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
.