Script: Ajouter un attribut dans un fichier XML

Pour éviter la tâche répétitive d'ajouter manuellement un même attribut à tous les éléments d'un même niveau dans un fichier XML, on utilisera ce script en PHP 5 qui requiert 3 paramètres.

Avec le premier script, addatt, les valeurs de l'attribut seront ajoutées manuellement.
Un second script, addval, lit les valeurs dans un tableau qu'il crée à partir d'un autre fichier XML.

Ajouter des attributs sans valeurs

Par exemple, à partir de ce document:

<doc>
  <voiture modele="xxx" />
  <voiture modele="yyy" />
</doc>

On veut ajouter automatiquement l'attribut "vitesse" au balises "voiture".

<doc>
  <voiture modele="xxx" vitesse="80" />
  <voiture modele="yyy" vitesse="90" />
</doc>

Utiliser le script

Il requiert trois paramètre

La commande a alors la forme suivante:

solp addatt fname tname aname

Le nouveau document XML est sauvé sous le nom de test.xml.
On efface alors le fichier originel pour renommer test.xml sous son nom.

Le code scriptol

DOMDocument docsrc = DOMDocument("1.0")
docsrc.load(filename) DOMNodeList dnl = docsrc.getElementsByTagName(tname)
DOMElement de = null int i = 0 while i < dnl.length
de = dnl.item(i)
de.setAttribute(aname, "")
let i + 1 docsrc.save(filename)

Le code PHP

$docsrc=new DOMDocument("1.0");
$docsrc->load($filename);

$dnl=$docsrc->getElementsByTagName($tname);
$i = 0;
while($i<$dnl->length)
 {
$de=$dnl->item($i);
$de->setAttribute($aname,""); $i+=1; } $docsrc->save($filename);

Ajouter des attributs avec leur valeur

Utiliser le script

Un paramètre final est ajoute: le nom du fichier XML où sont lues les valeurs.

Le code

La fonction précédente est modifiée de façon à lire les valeurs dans un tableau et les assigner aux éléments.

Cela suppose que les éléments aient un identifieur qui figure également dans le tableau. Pour cela on crée un tableau associatif avec les id comme clés, et comme valeurs celle de l'attribut.

Lecture des valeurs dans un fichier XML

DOMNodeList dnl = docval.getElementsByTagName(tname)	
DOMElement de = null array a = {} for int i in 0 -- dnl.length
de = dnl.item(i) text id = de.getAttribute(tagid) // get the ID
text value = de.getAttribute(aname) // get the value of the property for this ID a[id] = value
/for

Assigner les valeurs

while i < size
de = dnl.item(i)
text id = de.getAttribute(tagid)
de.setAttribute(aname, a[id])
let i + 1

Cette fois les attributs sont assignés en fonction du nom de balise et de l'identifieur de l'élément qui doit être la clé dans le tableau.

Télécharger les codes sources (Scriptol/PHP)