int a, b, q, r ;le même programme en syntaxe Ada :
main () {
scanf("%d", &a); scanf("%d", &b); q = 0; r = a;
while (r >= b) {
q = q+1; r = r-b;
}
printf("%d", q); printf("%d", r);
}
with Ada.Integer_Text_Io; use Ada.Integer_Text_Io;
procedure Main is
a, b, q, r : Integer;
begin get(a); get(b); q := 0; r := a;
while r >= b loop q := q+1; r := r-b; end loop;
put(q); put(r);
end Main;
<?xml version='1.0'?>
<Prog>
<Variables> <Var
nom="a"/> <Var nom="b"/> <Var
nom="q"/> <Var nom="r"/>
</Variables>
<Sequence>
<Lecture> <Var
nom="a"/> </Lecture>
<Lecture> <Var
nom="b"/> </Lecture>
<Affectation>
<Var nom="q"/> <Cte val="0"/>
</Affectation>
<Affectation> <Var nom="r"/>
<VarExp> <Var nom="a"/>
</VarExp> </Affectation>
<Boucle>
<Comparaison
op=">="> <VarExp> <Var
nom="r"/> </VarExp>
<VarExp> <Var nom="b"/>
</VarExp>
</Comparaison>
<Sequence>
<Affectation> <Var nom="q"/>
<Bin
op="+"> <VarExp> <Var nom="q"/>
</VarExp> <Cte val="1"/>
</Bin>
</Affectation>
<Affectation> <Var
nom="r"/>
<Bin op="-"> <VarExp><Var
nom="r"/></VarExp>
<VarExp><Var
nom="b"/></VarExp>
</Bin>
</Affectation>
</Sequence>
</Boucle>
<Ecriture> <VarExp> <Var
nom="q"/> </VarExp> </Ecriture>
<Ecriture> <VarExp> <Var
nom="r"/> </VarExp> </Ecriture>
</Sequence>
</Prog>
http://www.w3.org/TR/REC-DOM-Level-1/
traduction française http://xmlfr.org/w3c/TR/REC-DOM-Level-1/
Dans ce cours, nous nous concentrerons sur la
réalisation de DOM en Java.
Pour C++, voir l'implémentation Apache-Xerces.
Sur la réalisation homologue en PHP-5, on lira (outre le
Manuel PHP) un excellent
tutoriel introductif chez Développez.com.
La version JavaScript, qui se spécialise dans le traitement de HTML
est quelque peu différente dans le détail, nous n'en parlerons pas ici.
Node
:Document
, Element
,
Text
, Comment
,
etc.Element
donné :DOMNode
et DOMNodeList
.Element elt;
...
NodeList enfts = elt.getChildNodes();
getChildNodes()
: toute
la
collection (de type NodeList
)getFirstChild()
, getLastChild()
à n'employer que si vous êtes sûr que ce n'est pas un simple saut de
ligne...null
qui est retournée (sans
soulever d'exception). appendChild(Node newChild)
insertBefore(Node newChild, Node
refChild)
removeChild(Node oldChild)
replaceChild(Node newChild, Node
oldChild)
DOMException
.getAttribute(String name)
setAttribute(String name, String
value)
Element
, NodeList
getElementsByTagName(String nom).
Element elt;
...
NodeList enfts = elt.getChildNodes();
for( int i = 0; i < enfts.getLength(); i++ ){
Node en =
enfts.item(i);
String nm =
en
.getNodeName()
System.out.println(
nm);
if(! nm.equals("#text") ){ // on suppose que c'est
alors un Element
Element enf =
(Element) en;
enf.
setAttribute("vu", "1");
}
}
en PHP :// on suppoe que la variable $elt contient un
objet
Element
...
$enfts = $elt->getChildNodes();
foreach( $enfts as
$en
){
$nm =
$en->
getNodeName()
echo "$
nm\n";
if( nm != "#text" ){ // on suppose que c'est alors
un Element
$en->setAttribute("vu", "1");
}
}
Document
par Element rac =
doc.getDocumentElement();
Document
à
partir d'un fichier XML il faut recourir à un parseur DOM. DocumentBuilder
parseur = DocumentBuilderFactory.
newInstance().newDocumentBuilder();
Document doc = parseur.parse(nomFich);
$doc = new
DOMDocument();
$doc->load($fichIn);
DOMImplementation
domi = parseur.getDOMImplementation();
Document doc =
domi.createDocument(null, rac, null);
Si on veut en outre le doter d'une DTD, les
choses
se compliquent (en PHP aussi).
Element
elt = doc.createElement(String nom);
Text =
doc.createTextNode(String contenu);
élément_père.appendChild(élément_fils);
Node
, on peut utiliser l'attribut
générique attributes
Lire_1.php
<?php
/* Noms-Notes en format 1 */
function lire_1($doc){
$depart =
$doc->getElementsByTagName("liste")->item(0);
$k = 0; //nombre de notes
$s = 0; //le total
$les_eleves =
$depart->getElementsByTagName("eleve");
foreach( $les_eleves as $l_eleve ){
$le_nom =
$l_eleve->getAttribute("nom");
$la_note
= $l_eleve->getAttribute("note");
echo
"$le_nom a pour note $la_note\n";
$s +=
$la_note;
$k++;
}
if( $k == 0 ){
die("fichier vide");
}else{
return
$s/$k;
}
}// lire_1
function lecture ($fichIn){
$doc = new DOMDocument();
$doc->load($fichIn);
$moy = lire_1($doc);
echo "\nMoyenne : $moy\n";
}//lecture
lecture("Nom_note1.xml");
?>
Lire_1.java
/*
Noms-Notes en format 1 */
import org.w3c.dom.NodeList;
import org.w3c.dom.Element;
import org.w3c.dom.Document;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
public class Lire_1{
public static float lire_1(Document doc)
throws Exception {
Element
depart = doc.getDocumentElement();
int k =
0; //nombre de notes
int s =
0; //le total
NodeList
les_eleves = depart.getElementsByTagName("eleve");
for( int
i = 0; i < les_eleves.getLength(); i++ ){
Element l_eleve = (Element)
les_eleves.item(i); // coercion !
String le_nom =
l_eleve.getAttribute("nom");
String la_note =
l_eleve.getAttribute("note");
System.out.println(le_nom+" a pour note
"+la_note);
s += Integer.parseInt(la_note);
k++;
}
if( k ==
0 ){
throw (new Exception("fichier vide"));
}else{
return s/k;
}
}// lire_1
public static void main(String[] args)
throws Exception {
DocumentBuilder parseur = DocumentBuilderFactory.
newInstance().newDocumentBuilder();
Document
doc = parseur.parse("Nom_note1.xml");
float moy
= lire_1(doc);
System.out.println("\nMoyenne : "+moy);
}//main
}// class Lire_1
l_eleve
",
mais les contenus textuels des fils <nom>
et <note>
firstChild
) de <nom>
et de <note>
, et dont il faut
extraire la chaîne-contenu.firstChild
est un attribut, et la
chaîne-contenu est aussi un attribut wholeText
.Lire_2.php
) :foreach(
$les_eleves as $l_eleve ){
$elt_nom
= $l_eleve->getElementsByTagName("nom")->item(0);
$elt_note
= $l_eleve->getElementsByTagName("note")->item(0);
$le_nom =
$elt_nom->firstChild->wholeText;
$la_note
= $elt_note->firstChild->wholeText;
....... le reste sans changement......
}
getFirstChild
est une méthode, et la
chaîne-contenu s'obtient par une méthode getData()
Text
,
d'où une indispensable coercion.Lire_2.java
) :for(
int i = 0; i < les_eleves.getLength(); i++ ){
Element
l_eleve = (Element) les_eleves.item(i); // avec coercion
Node
elt_nom = l_eleve.getElementsByTagName("nom").item(0); // sans coercion
Node
elt_note = l_eleve.getElementsByTagName("note").item(0);
String
le_nom = ((Text)elt_nom.getFirstChild()).getData(); // avec coercion
String
la_note = ((Text)elt_note.getFirstChild()).getData();
....... le reste sans changement......
}
<eleve>
correspondant.<eleve>
construit
les bonnes valeurs de ses deux attributs.Document
vide dans
lequel on installera une <liste>
qui contiendra les <eleve>
s, Document
construit dans un fichier.Trad1fromText.php
<?php
function doc1fromText($nomFich){ // construit le DOMDocument
$doc = new DOMDocument();
$rac =
$doc->createElement("liste");
$doc->appendChild($rac);
$lignes = file($nomFich);
foreach( $lignes as $ligne ){
$nom_note
= split("[ \t]+", $ligne);
$le_nom =
$nom_note[0];
$la_note
=
rtrim($nom_note[1]);
$elv =
$doc->createElement("eleve");
$rac->appendChild($elv);
$elv->setAttribute("nom", $le_nom);
$elv->setAttribute("note", $la_note);
}
return $doc;
}// doc1fromText
function trad1fromText($fichIn, $fichOut){
$doc = doc1fromText($fichIn);
$doc->save($fichOut);
}
trad1fromText("NomsNotes.txt", "NomsNotes.1.xml");
?>
BufferedReader
Trad1fromText.java
/* Traduction d'un fichier Noms-Notes de texte à
XML
format 1 <eleve nom="Toto" note="12
/>
avec Javax standard.
*/
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import java.io.File;
import java.io.BufferedReader;
import java.io.FileReader;
public class Trad1fromText {
public static Document
doc1fromText(BufferedReader entree) throws Exception {
DocumentBuilder parseur =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document
doc =
parseur.getDOMImplementation().createDocument(null, "liste",
null);
Element
rac = doc.getDocumentElement();
String
ligne = entree.readLine();
do {
String[] nom_note = ligne.split("[
\t]+");
// Attention à ne pas oublier la
tabulation !
String le_nom = nom_note[0];
String la_note = nom_note[1].trim();
Element elv = doc.createElement("eleve");
rac.appendChild(elv);
elv.setAttribute("nom", le_nom);
elv.setAttribute("note", la_note);
ligne = entree.readLine();
} while ( ligne != null );
return
doc;
}//doc1fromText
public static void main(String[] args)
throws Exception{
BufferedReader entree =
new BufferedReader (new FileReader
("NomsNotes.txt"));
Document
doc = doc1fromText(entree);
DOMSource
src = new DOMSource(doc);
StreamResult res = new StreamResult(new File("NomsNotes.1.xml"));
Transformer trans = TransformerFactory.newInstance().newTransformer();
trans.transform(src, res);
} // main
}//class Trad1fromText
System.out.println(le_nom+"
a pour note
"+la_note);
.Document
sur fichier :Document
construitXML::DOM
en
Perl où on trouve une opération createXMLDecl(version,
charset)
]javax.xml.transform.stream.StreamResult
(cf. Bréviaire),
java.io.Writer
,
on choisit donc pour le réaliser la classe java.io.OutputStreamWriter
.Writer
sortie = new OutputStreamWriter(System.out, "UTF-8");
nomFich
: Writer sortie = new
OutputStreamWriter (new FileOutputStream (nomFich), "UTF-8");
Document doc
s'écrit : DOMSource src = new DOMSource(doc);
StreamResult res = new StreamResult(sortie);
Transformer trans = TransformerFactory.newInstance().newTransformer();
trans.transform(src, res);
PrintWriter
OutputStreamWriter
, pour pouvoir
utiliser les méthodes habituelles print
et println
.PrintWriter ma_sortie = new
PrintWriter(sortie, true);
" true
" ayant pour effet que
println
vide le buffer (en anglais
flush),
DocumentBuilder
)
tient automatiquement compte du codage annoncé dans l'en-tête XMLencoding.
java.io.InputStreamReader
qui
est compétente : nomFich
, on
construira ainsi le BufferedReader
nécessaire
à la lecture ligne à ligne :BufferedReader entree =
new BufferedReader (
new InputStreamReader(new FileInputStream (nomFich), "UTF-8") );
<eleve>
: au lieu de le doter de deux attributs, Trad2fromText.php
$elv =
$doc->createElement("eleve");
$rac->appendChild($elv);
$elt_nom
= $doc->createElement("nom");
$elv->appendChild($elt_nom);
$elt_nom->appendChild($doc->createTextNode($nom));
$elt_note
= $doc->createElement("note");
$elv->appendChild($elt_note);
$elt_note->appendChild($doc->createTextNode($note));
Trad2fromText.java
Element
elv = doc.createElement("eleve");
rac.appendChild(elv);
Element elt_nom =
doc.createElement("nom");
elv.appendChild(elt_nom);
elt_nom.appendChild(doc.createTextNode(nom));
Element elt_note =
doc.createElement("note");
elv.appendChild(elt_note);
elt_nom.appendChild(doc.createTextNode(note));
UnVersDeux.php
<?php
/* Du format 1 au format 2 des Noms-Notes */
function transform1_2($doc){ /* $doc est en format 1
la fonction
renvoie un autre DOMDocument en format 2 */
$depart =
$doc->getElementsByTagName("liste")->item(0);
$res = new DOMDocument();
$rac =
$res->createElement("liste");
$res->appendChild($rac);
$les_eleves =
$depart->getElementsByTagName("eleve");
foreach( $les_eleves as $l_eleve ){ // comme
dans "Lire_1.php"
//lecture - idem, repris à
"Lire_1.php"
$le_nom =
$l_eleve->getAttribute("nom");
$la_note
= $l_eleve->getAttribute("note");
//construction - recopié de "Trad2fromtext.php
$elv =
$res->createElement("eleve");
$rac->appendChild($elv);
$elt_nom = $res->createElement("nom");
$elv->appendChild($elt_nom);
$elt_nom->appendChild($res->createTextNode($le_nom));
$elt_note = $res->createElement("note");
$elv->appendChild($elt_note);
$elt_note->appendChild($res->createTextNode($la_note));
}
return $res;
}// transform1_2
function UnVersDeux($fichIn, $fichOut){
$doc = new DOMDocument();
$doc->load($fichIn);
$res = transform1_2($doc);
$res->save($fichOut);
}//UnVersDeux
UnVersDeux("Nom_note1.xml", "NN2.xml");
?>
UnVersDeux.java
/*
Du
format 1 au format 2 des Noms-Notes */
import org.w3c.dom.Element;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.DOMImplementation;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import java.io.File;
public class UnVersDeux{
public static Document
transform1_2(Document doc) throws Exception {
Element
depart = doc.getDocumentElement();
DocumentBuilder parseur =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document
res =
parseur.getDOMImplementation().createDocument(null, "liste",
null);
Element
rac = res.getDocumentElement();
NodeList
les_eleves = depart.getElementsByTagName("eleve");
for( int
i = 0; i < les_eleves.getLength(); i++ ){
//lecture
Element l_eleve = (Element)
les_eleves.item(i); // coercion !
String le_nom =
l_eleve.getAttribute("nom");
String la_note =
l_eleve.getAttribute("note");
//construction
Element elv = res.createElement("eleve");
rac.appendChild(elv);
Element elt_nom =
res.createElement("nom");
elv.appendChild(elt_nom);
elt_nom.appendChild(res.createTextNode(le_nom));
Element elt_note =
res.createElement("note");
elv.appendChild(elt_note);
elt_nom.appendChild(res.createTextNode(la_note));
}
return
res;
}
public static void main(String[] args)
throws Exception {
DocumentBuilder parseur = DocumentBuilderFactory.
newInstance().newDocumentBuilder();
Document
doc = parseur.parse("Nom_note1.xml");
Document
res = transform1_2(doc);
DOMSource
src = new DOMSource(doc);
StreamResult out = new StreamResult(new File("NN2.xml"));
Transformer trans = TransformerFactory.newInstance().newTransformer();
trans.transform(src, out);
}//main
}