Cette classe peut être utilisée indépendamment de facade et offre un ensemble de méthodes permettant de créer, ouvrir, dupliquer, modifier, sauvegarder un fichier xml. Elle permet également de copier le contenu d’un fichier XML dans un autre, d ‘en copier, couper, coller des éléments d’un nœud dans un autre, etc …
vous pouvez charger la classe ici >>
Tout d’abord créons une instance de gest_xml
1 2 | require_once('Classes/systeme/gest_xml.php'); $gest = new gest_xml(); |
1) Les fichiers
Si il n’existe pas de fichier à lire le plus simple est d’en créer un :
a) créer un nouveau document
deux méthodes sont possibles : La première
1 | $gest-> init_xml(); |
qui se contente de créer un document vide on obtiendra quelque chose qui ressemble à ça :
2 | <!--?xml version="1.0" encoding="UTF-8"?--> |
La seconde
1 | $gest->DOM_create_root("racine"); |
On obtient alors:
2 3 | <!--?xml version="1.0" encoding="UTF-8"?--> <racine/> |
Qui ajoutera un élément racine à notre document. Le nom de l’élément racine ne peut comporter que des caractères alphanumériques . Aussi si l’on entre la commande suivante:
1 | $gest->DOM_create_root("raci@_ne"); |
Les caractères incorrects seront remplacés par des X et l’on obtiendra le résultat suivant :
2 3 | <!--?xml version="1.0" encoding="UTF-8"?--> <raciXXne/> |
Pour l’instant notre document réside en mémoire mais n’est pas sauvegardé et disparaitra lorsque le script s’achèvera. Cest pouquoi nous allons le sauvegarder pour pouvoir y travailler ultérieurement.
b) sauvegarder un document
Pour sauvegarder le document il nous faut lui donner un nom et un chemin vers le dossier où nous souhaitons qu’il réside en renseignant la propriété doc_name de notre instance en utilisant la méthode set_prop de celle ci .
1 | $gest->set_prop('doc_name',"xml/mon_premier_ficher.xml"); |
alors nous pouvons sauvegarder notre document en utilisant la commande save_doc()
1 | $gest->save_doc(); |
Un nouveau fichier mon_premier_ficher.xml se trouve maintenant dans notre répertoire xml. Attention le dossier cible doit être préalablement créé avant d’effectuer la sauvegarde Le nom du fichier ne doit pas contenir de caractères spéciaux. Nous avons donc créé un fichier et nous pouvons en faire un second, soit en créant une nouvelle instance soit en utilisant la même, mais nous ne pourrons plus travailler sur notre fichier tant que nous le chargerons pas à nouveau. Si nous passons la commande suivante à l’instance en cours ($gest)
1 | $gest->DOM_create_root("adresses"); |
nous n’aurons plus accès à notre précédent contenu sauvegardons le document :
1 2 | $gest->set_prop('doc_name',"xml/carnet_adresse.xml"); $gest->save_doc(); |
et nous voilà à la tête de deux fichiers XML
- mon_premier_ficher.xml
- carnet_adresse.xml
c) ouvrir un fichier
Il est possible de créer maintenant une seconde instance de gest_xml et d’y charger notre premier fichier en appelant la méthode open_doc de l’instance :
1 2 | $gest2 = new gest_xml(); $gest2->open_doc("xml/mon_premier_ficher.xml"); |
pour afficher le contenu du fichier on peut utiliser la méthode dump_doc sur l’instance $gest2
1 | print($gest2->dump_doc()); |
qui affichera ceci
2 3 | <!--?xml version="1.0" encoding="UTF-8"?--> <raciXXne/> |
ou en utilisant l’instance $gest
1 | print($gest->dump_doc()); |
qui affichera cela
2 3 | <!--?xml version="1.0" encoding="UTF-8"?--> <adresses/> |
2) manipulation des éléments
a) créer des nœuds enfants
Je parlerais dans la suite du document, de nœuds ou d’éléments de manière indifférenciée. Commençons à garnir notre carnet d’adresses de nouveaux éléments afin d’obtenir quelque chose qui ressemble à :
10 11 12 13 14 15 16 17 | <adresses> <personne> <nom /> <prenom /> <adresse /> <telephone /> </personne> </adresses> |
Nous allons dans un premier temps créer un noeud personne qui devra accueillir les nœuds nom, prénom, adresse et téléphone . La création d’un nœud utilise la méthode DOM_add_node en lui passant 2 arguments :
- le nœud parent c’est à dire le nœud dans lequel on souhaite le créer (dans le cas de ‘personne’ le nœud parent est ‘adresses’
- son nom : ‘personne’
1) récupération du nœud parent (ici l’élément racine du document) à l’aide de la méthode DOM_get_root
1 | $root = $gest->DOM_get_root(); |
puis création d’un nouveau nœud ‘personne’ que nous conserverons dans la variable $p afin de l’utiliser par la suite
1 2 | $p = $gest->DOM_add_node($root,'personne'); print ($gest->dump_doc(); |
10 11 12 | <adresses> <personne /> </adresses> |
puis ajoutons au nœud ‘personne’ les nœuds enfants comme ceci :
1 2 3 4 5 | $gest->DOM_add_node($p,'nom'); $gest->DOM_add_node($p,'prenom'); $gest->DOM_add_node($p,'adresse'); $gest->DOM_add_node($p,'telephone'); print($gest->dump_doc()); |
Le contenu de notre document ressemble à
10 11 12 13 14 15 16 17 | <adresses> <personne> <nom /> <prenom /> <adresse /> <telephone /> </personne> </adresses> |
il peut être intéressant de créer une fonction capable d’ajouter une personne à notre carnet
1 2 3 4 5 6 7 8 9 10 11 12 | function add_personne(){ $root = $gest->DOM_get_root(); $p = $gest->DOM_add_node($root,'personne'); $gest->DOM_add_node($p,'nom'); $gest->DOM_add_node($p,'prenom'); $gest->DOM_add_node($p,'adresse'); $gest->DOM_add_node($p,'telephone'); $gest->save_doc(); return ($p); } // ajout d'une nouvelle entrée au carnet : add_personne(); |
Une autre méthode nous permet d’ajouter un nœud enfant à un élément DOM_add_node_to_target($node = « »,$node_dest = « ») à la différence de la méthode précédente celle ci ne prend pas un nom en argument pour le nœud enfant mais un nœud existant ce qui permet de déplacer des nœuds dans notre xml
b) ajouter du contenu à un nœud
Il serait bon maintenant de pouvoir ajouter du contenu à notre nouveau nœud . Comme la fonction que nous venons de créer nous retourne le noeud personne qu’elle vient de créer il va falloir lui préciser lequel de ses enfants nous souhaitons renseigner. Admettons que nous souhaitions ajouter une personne s’appelant Jeanot Lapin habitant 3 impasse du terrier 000000 lapinVille dont le téléphone est le 01 23 45 67 89 nous souhaiterions que notre fichier ressemble à ceci
10 11 12 13 14 15 16 17 | <adresses> <personne> <nom > Lapin</nom > <prenom >Jeanot</prenom > <adresse >3 impasse du terrier 00000 LapinVille</adresse > <telephone >01 23 45 67 89 </telephone > </personne> </adresses> |
Nous pouvons modifier notre fonction et lui passer ces différents éléments comme argument et utiliser la méthode DOM_make_content dont le rôle est justement d’ajouter du contenu à un élément. La signature de cette méthode est DOM_make_content($node= » », $val_content= » »)
1 2 3 4 5 6 7 8 9 10 11 | function add_personne($gest,$nom,$prenom,âdresse, $telephone){ $root = $gest->DOM_get_root(); $p = $gest->DOM_add_node($root,'personne'); $gest->DOM_make_content($gest->DOM_add_node($p,'nom'), $nom); $gest->DOM_make_content($gest->DOM_add_node($p,'prenom'), $prenom); $gest->DOM_make_content($gest->DOM_add_node($p,'adresse'), $adresse); $gest->DOM_make_content($gest->DOM_add_node($p,'telephone'), $telephone); $gest->save_doc(); return ($p); } add_personne($gest,'lapin','Jeannot','3 rue des terriers 00000 LapinVille', '0123456789') |
Bien, mais il arrive parfois que l’on souhaite ajouter du contenu non-affichable dans notre fichier. Par exemple il m’est arrivé de désirer placer du contenu XML dans certains éléments de mes fichiers XML mais que celui-ci ne soit pas analysé comme élément de la structure qui le contient, ou un fragment HTML ou encore un morceau de code Javascript, une variable JSON…. Dans ce cas la solution consistera à placer ce contenu dans un élément CDATA avec la méthode DOM_add_CDATA elle fonctionne comme la méthode DOM_make_content mais le contenu sera alors ‘enrobé’ dans un élément CDATA ce qui évitera que ce contenu soit analysé à la lecture du fichier. De même certains caractères exotiques, accentués pourraient causer soucis, bien que ce ne soit pas le cas avec nos instances de gest_xml. En effet toutes les valeurs ajoutées au XML sont préalablement ‘utf8 encodés’ et seront ‘utf8 décodées’ lorsque nous les récupérerons plus tard. si mon ami lapin s’appelle Hervé j’obtiens donc avec Dom_make_content
1 | <prenom>hervé</prenom> |
et avec DOM_add_CDATA
1 | <prenom><!CDATA[hervé]]></prenom> |
c) ajouter des arguments à un nœud
Bon, pour l’instant nous n’avons pas ajouté d’attributs à nos éléments. ne serait-ce qu’un id pourtant si efficace lors de notre recherche dans un fichier XML qui peut rapidement dépasser les milliers d’entrées et devenir très délicat à gérer. Ce qui fera la différence entre une personne et une autre tiendra souvent dans un simple attribut : sa taille, son genre, sa qualité (ami, connaissance, collègue ….)et qui ne justifient pas, dans bien des cas, d’ajouter un nœud enfant pour le gérer. La méthode pour ajouter un identifiant s’appelle DOM_add_node_attribut et sa signature est : DOM_add_node_attribut($nom_att = « »,$val_att = « »,$elem = « ») par exemple
$root = $gest->DOM_get_root();
$p = $gest->DOM_add_node($root,'personne');
$gest -> DOM_add_node_attribut('id','1000',$p);
générera
1 | <personne id="1000"/> |
il est possible d’ajouter un autre attribut en appelant de nouveau la méthode sur ce nœud comme ceci
1 2 3 4 5 | $root = $gest->DOM_get_root(); $p = $gest->DOM_add_node($root,'personne'); $gest -> DOM_add_node_attribut('id','1000',$p); $gest -> DOM_add_node_attribut('genre','m',$p); $gest -> DOM_add_node_attribut('age','15',$p); |
générera
1 | <personne id="1000" genre="m" age="15"/> |
ajouter plusieurs attributs
en utilisant DOM_add_several_arguments_to_node($array_arg = array(), $noeud = « ») il est possible de créer plusieurs attributs en une fois. L’argument $array_arg est un tableau associatif de type (array(‘attribut’=>’valeur’,…’attribut_n’=>’valeur_n’). Ce qui donnerait pour l’exemple précédent
1 | $gest->DOM_add_several_arguments_to_node(array('id'=>'1000','genre'=>'m','age'=>'15'),$p); |
plus tranquille 🙂
ajouter plusieurs nœuds
De même il est possible de créer plusieurs nœuds possédant différents arguments et différents contenus en utilisant : DOM_add_nodes_chidren($nom_enf = array(), $attrib_enf= array(), $content_enf=array(),$content_format=array(), $noeud_parent= » »).
- le premier argument de la méthode ($nom_enf) est un simple tableau contenant les noms des différents nœuds enfants que l’on souhaite ajouter
- le second ($attrib_enf) est également un tableau qui, pour chaque nœud enfant contiendra un tableau associatif contenant les attributs . Si un noeud ne possède pas d’attribut on passera un chaine vide à la place du tableau.
- le troisième ($content_enf) est aussi un tableau contenant le contenu de chaque nouveau nœud.
- le quatrième ($content_format) précise (ou non) pour chaque contenu s’il s’agit d’un élément Cdata.
- le dernier argument ($noeud_parent) contient l’élément auquel on souhaite ajouter les nœuds enfants. Si cet argument est omis il ne se passera rien.
si je souhaite entrer différents nouveaux contacts de genre et d’ages différents je peux procéder ainsi
$p = $gest->DOM_add_node($root,'personne');
$gest->DOM_add_several_arguments_to_node(array('id'=>'1','genre'=>'m','age'=>'15'),$p);
$gest->DOM_add_nodes_chidren(
array('nom','prenom','adresse','telephone'),// liste des nom des noeus
array(array('surnom'=>'le lievre')),//liste de listes d ' attibuts ici surnom s'applique au nœud nom
array('lapin','jeannot','Impasse des terriers 00000 Lapinville','01 23 45 67 89'),
array('','','CData',''),
$p);
$p = $gest->DOM_add_node($root,'personne');
$gest->DOM_add_several_arguments_to_node(array('id'=>'2','genre'=>'f','age'=>'19'),$p);
$gest->DOM_add_nodes_chidren(
array('nom','prenom','adresse','telephone'),// liste des nom des noeus
array(array('surnom'=>'lacanCanne'),'',array('code'=>'007')),//liste de listes d ' attibuts. a noter que le second argument s'applique au noeud 'adresse'
array('lacanne','jeanne','rue de la mare 00000 Canneville','01 23 45 67 89'),
array('','','CData',''),
$p);
et j’obtiens
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <adresses> <personne id="1" genre="m" age="15"> <nom surnom="le lievre">lapin</nom> <prenom>jeannot</prenom> <adresse><![CDATA[Impasse des terriers 00000 Lapinville]]></adresse> <telephone>01 23 45 67 89</telephone> </personne> <personne id="2" genre="f" age="19"> <nom surnom="lacanCanne">lacanne</nom> <prenom>jeanne</prenom> <adresse code="007"><![CDATA[rue de la mare 00000 Canneville]]></adresse> <telephone>01 23 45 67 89</telephone> </personne> </adresses> |
3) Rechercher dans le document
a) récupération d’une liste de nœuds par leur nom
Maintenant que notre document commence à se remplir il devient pertinent de vouloir en extraire quelque chose. Retrouver un contenu, la valeur d’un argument, un nœud, son parent, ses enfants, une liste de nœuds répondant à certains arguments …. si je souhaite par exemple modifier le nom d’un de mes contacts il va falloir récupérer le nœud ayant ce nom comme contenu et le modifier. Cherchons le noeud nom contenant le texte ‘lapin’. Une première façon d’opérer peut consiter à récupérer dans une liste l’ensemble des noeud ‘nom’ avec la méthode DOM_get_element($nom_elem= »* ») puis faisons une boucle sur la liste de nœuds retournés
1 2 3 4 5 6 7 8 9 | $listNode =$gest->DOM_get_element("nom"); $nbNodes = count($listNode); for($i=0;$i<$nbNodes;$i++){ print($gest->DOM_get_content_node($listNode[$i]).' - '); } /* retourne lapin - lacanne - */ |
nous pouvons tester la valeur du contenu du nœud et la modifier si elle contient ‘lapin’ et modifions la
1 2 3 4 5 6 7 8 9 10 11 12 | $listNode =$gest->DOM_get_element("nom"); $nbNodes = count($listNode); for($i=0;$i<$nbNodes;$i++){ if($gest->DOM_get_content_node($listNode[$i])== 'lapin'){ $gest->DOM_make_content($listNode[$i], 'lapin de garenne'); } print($gest->DOM_get_content_node($listNode[$i]).' - '); } /* retourne lapin de garenne - lacanne - */ |
b) récupération du parent d’un nœud
si l’âge de lapin a changé il faut modifier l’attribut age du nœud personne le contenant. Pour ce faire il nous faut chercher notre élément lapin, récupérer son nœud parent ‘personne’ et modifier son attribut age. pour récupérer le nœud parent utilisons la méthode DOM_get_parent_node($elem)
1 2 3 4 5 6 7 8 9 10 | $listNode =$gest->DOM_get_element("nom"); $nbNodes = count($listNode); for($i=0;$i<$nbNodes;$i++){ if($gest->DOM_get_content_node($listNode[$i])== 'lapin'){ $gest->DOM_make_content($listNode[$i], 'lapin de garenne'); //mofication du contenu du noeud $personne = $gest->DOM_get_parent_node($listNode[$i]); // recupération du noeud parent $gest->DOM_add_node_attribut('age','16',$personne);// modification d'un attribut } print($gest->dump_doc()); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?xml version="1.0" encoding="UTF-8"?> <adresses> <personne id="1" genre="m" age="16"> <nom surnom="le lievre">lapin de garenne</nom> <prenom>jeannot</prenom> <adresse><![CDATA[Impasse des terriers 00000 Lapinville]]></adresse> <telephone>01 23 45 67 89</telephone> </personne> <personne id="2" genre="f" age="19"> <nom surnom="lacanCanne">lacanne</nom> <prenom>jeanne</prenom> <adresse code="007"><![CDATA[rue de la mare 00000 Canneville]]></adresse> <telephone>01 23 45 67 89</telephone> </personne> </adresses> |
et voila un lapin de 16 ans. Maintenant dans le cadre d’une étude sur les amis des lapins je souhaiterais ajouter un nœud ‘amis’ aux lapins pour y conserver les numéros de téléphones des personnes de mon carnet qui sont ami avec cet individu.
c) récupération d’une liste de nœuds à l’aide d’un pattern XPATH
De nouveau je vais récupérer les nœuds ‘personne’ parents de ceux contenant le texte ‘lapin’ mais plutôt que de faire une boucle sur un ensemble de noeuds de type ‘nom’ je souhaiterais cibler directement tous ceux dont le contenu contient le texte ‘lapin’. Ce pattern XPATH me le permet facilement : « //nom[text()=’lapin’]/parent::personne » et en utilisant le méthode suivante : get_node_by_Xpath($pattern) je vais pouvoir le faire et ajouter un noeud ‘amis’ pour chaque lapin
1 2 3 4 5 6 7 | $pattern = "//nom[text()='lapin']/parent::personne"; $listNode = $gest->get_node_by_Xpath($pattern); $nbNodes = count($listNode); for($i=0;$i<$nbNodes;$i++){ $gest->DOM_add_node($listNode[$i],'amis'); } print($gest->dump_doc()); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?xml version="1.0" encoding="UTF-8"?> <adresses> <personne id="1" genre="m" age="15"> <nom surnom="le lievre">lapin</nom> <prenom>jeannot</prenom> <adresse><![CDATA[Impasse des terriers 00000 Lapinville]]></adresse> <telephone>01 23 45 67 89</telephone> <amis/> </personne> <personne id="2" genre="f" age="19"> <nom surnom="lacanCanne">lacanne</nom> <prenom>jeanne</prenom> <adresse code="007"><![CDATA[rue de la mare 00000 Canneville]]></adresse> <telephone>01 23 45 67 89</telephone> </personne> </adresses> |
l’idée ici n’est pas de présenter le fonctionnement de XPATH mais de montrer les possibiités qu’offre gest_xml dans son utilisation
d) copier/coller un nœud
Jeanne lacanne est une amie du lapin il convient donc de récupérer le nœud ‘personne’ qui l’abrite et de le copier dans le noeud ‘amis’ du lapin. Il va falloir : récupérer le nom personne de Lacanne à l’aide de get_node_by_Xpath
1 2 | $pattern = "//nom[text()='lacanne']/parent::personne"; $listNode = $gest->get_node_by_Xpath($pattern); |
le copier avec la méthode DOM_copy_node($node,$profondeur=1) l’attribut $profondeur précise si l’on souhaite récupérer les nœuds enfants s’ils ont pour valeur 1
1 | $gest->DOM_copy_node($listNode[0],1); |
récupérer le noeud amis du lapin à l’aide de get_node_by_Xpath à l’aide d’un nouveau pattern: « //nom[text()=’lapin’]/parent::personne/amis »
1 2 | $pattern = "//nom[text()='lapin']/parent::personne/amis"; $listNodesAmis = $gest->get_node_by_Xpath($pattern); |
et enfin y coller le noeud précédemment collé à l’aide de la méthode DOM_paste_node($node_dest) où l’argument
1 2 3 4 | $node_dest sera le noeud 'amis' $gest->DOM_paste_node($listNodeAmis[0]); // même s'il n'y a qu'un nœud le méthode get_node_by_Xpath retourne un tableau print($gest->dump_doc()); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <adresses> <personne id="1" genre="m" age="15"> <nom surnom="le lievre">lapin</nom> <prenom>jeannot</prenom> <adresse><![CDATA[Impasse des terriers 00000 Lapinville]]></adresse> <telephone>01 23 45 67 89</telephone> <amis> <personne id="2" genre="f" age="19"> <nom surnom="lacanCanne">lacanne</nom> <prenom>jeanne</prenom> <adresse code="007"><![CDATA[rue de la mare 00000 Canneville]]></adresse> <telephone>01 23 45 67 89</telephone> </personne> </amis> </personne> <personne id="2" genre="f" age="19"> <nom surnom="lacanCanne">lacanne</nom> <prenom>jeanne</prenom> <adresse code="007"><![CDATA[rue de la mare 00000 Canneville]]></adresse> <telephone>01 23 45 67 89</telephone> </personne> <personne id="1000" genre="m" age="15"/> </adresses> |
bien entendu le simple id aurait suffit mais pour la démonstration il me semble intéressant de copier tout le nœud ‘personne’ dans ‘amis’. Il est également possible de couper l’élément plutôt que de le copier avec la méthode DOM_cut_node($node,$profondeur=1) identique à la précédente mais qui supprime le nœud d’origine une fois collé.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <adresses> <personne id="1" genre="m" age="15"> <nom surnom="le lievre">lapin</nom> <prenom>jeannot</prenom> <adresse><![CDATA[Impasse des terriers 00000 Lapinville]]></adresse> <telephone>01 23 45 67 89</telephone> <amis> <personne id="2" genre="f" age="19"> <nom surnom="lacanCanne">lacanne</nom> <prenom>jeanne</prenom> <adresse code="007"><![CDATA[rue de la mare 00000 Canneville]]></adresse> <telephone>01 23 45 67 89</telephone> </personne> </amis> </personne> </adresses> |
e) importer le contenu d’un fichierXML dans un nœud d’un autre fichier
il m’est arrivé de vouloir importer le contenu d’un fichier XML dans un autre fichier XML, pour cela j’ai créé une méthode DOM_insert_file_content(). Son utilisation suppose que l’on renseigne un attribut fic_xml avec comme valeur le chemin complet vers le fichier que lon souhaite importer. Tout d’abord sauvegardons notre carnet
1 | $gest->save_doc(); |
ouvrons notre second fichier dans $gest ou une autre instance de gest_xml
$gest->open_doc("xml/mon_premier_ficher.xml"); |
son contenu est
1 2 | <?xml version="1.0" encoding="UTF-8"?> <raciXXne/> |
ajoutons y un nœud ‘import’ et renseignons l’argument fic_xml pour qu’il fasse reference au xml du carnet
1 2 3 | $root=$gest->DOM_get_root(); $import=$gest->DOM_add_node($root,'import'); $gest->DOM_add_node_attribut('fic_xml','xml/carnet_adresse.xml',$import); |
<?xml version="1.0" encoding="UTF-8"?> <raciXXne><import fic_xml="xml/carnet_adresse.xml"/></raciXXne> |
lançons l’importation du fichier
1 | $gest->DOM_insert_file_content(); |
enfin vérifions le contenu de notre document
1 | print($gest2->dump_doc()); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?xml version="1.0" encoding="UTF-8"?> <raciXXne> <import fic_xml="xml/carnet_adresse.xml"> <adresses> <personne id="1" genre="m" age="15"> <nom surnom="le lievre">lapin</nom> <prenom>jeannot</prenom> <adresse><![CDATA[Impasse des terriers 00000 Lapinville]]></adresse> <telephone>01 23 45 67 89</telephone> <amis> <personne id="2" genre="f" age="19"> <nom surnom="lacanCanne">lacanne</nom> <prenom>jeanne</prenom> <adresse code="007"><![CDATA[rue de la mare 00000 Canneville]]></adresse> <telephone>01 23 45 67 89</telephone> </personne> </amis> </personne> </adresses> </import> </raciXXne> |
Cette méthode permet de travailler sur un ensemble de fichiers XML indépendant et de les regrouper lorsque le besoin s’en fait sentir. Je n’irai pas plus loin sur les méthodes de la classe gest_xml, un certain nombre ne sont pas documentées ici en voici une liste complète :