Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

PHP et DOM XML : Mise en forme du fichier de sortie

4 réponses
Avatar
fragmonster
Bonjour,
j'ai besoin de manipuler des fichiers XML en PHP. Par "manipuler"
j'entends extraire des noeuds et en insérer.

Pour l'extraction : pas de souci avec XPath

Par contre, pour l'insertion, c'est un peu plus compliqué. Non pas que
celà ne fonctionne pas, mais j'ai des souci de mise en forme de mon
fichier.

Prenons un exemple de fichier XML source, dans lequel je dois insérer
des données :
Code:

<A>
<Objects>
<Obj>foo</Obj>
<Obj>bar</Obj>
</Objects>
</A>


Dans ce fichier je dois insérer un nouveau groupe de balise (que la
DTD m'autorise bien entendu) afin d'obtenir ceci :
Code:

<A>
<New>
<Data1></Data1>
<Data1></Data1>
</New>
<Objects>
<Obj>foo</Obj>
<Obj>bar</Obj>
</Objects>
</A>


Mais, après execution de mon script j'obtiens ça :
Code:

<A>
<Objects>
<Obj>foo</Obj>
<Obj>bar</Obj>
</Objects>
<New><Data1></Data1><Data1></Data1></New></A>

"XMLement" parlant c'est valide. La DTD est bien respectée. Par
contre, mon fichier source qui était correctement indenté devient
vite désordonné, d'où mes 2 questions :

1-Est-il possible d'insérer mon groupe <New> directement sous <A>
2-Est-il possible d'indenter les balises insérée afin de conserver la
lisibilité originale de mon fichier source?

Merci

4 réponses

Avatar
Demosthene
2-Est-il possible d'indenter les balises insérée afin de conserver la
lisibilité originale de mon fichier source?


Oui avec "n" en bout de chaine et t pour chaque tabulation

Bonne Journée

Cordialement Démosthène

Avatar
ftc
1-Est-il possible d'insérer mon groupe <New> directement sous <A>


Tu commences par récupérer le premier fils avec $first_child =
$domnode->first_child().
Ensuite tu peux insérer ton noeud avec $domnode->insert_before(
$newnode, $first_child );

2-Est-il possible d'indenter les balises insérée afin de conserver la
lisibilité originale de mon fichier source?


$doc->dumpfile( 'file.xml', false, true ); // c'est le troisième
paramètre qui est sensé formatter la sortie

C'est avec la version DOMXML ( php4 ), pour PHP5, c'est l'extension DOM,
les fonctions ont leur équivalent.

Avatar
flconseil
1) Bien sûr. Tu peux insérer un noeud n'importe où du moment qu'il
reste en dessous de ton objet root <A>.
Je ne sais pas quelle API XML tu utilises, mais avec l'API DOM de PHP
5, tu as une methode DOMNode->insertBefore dans laquelle tu peux
spécifier que tu veux créer un nouveau noeud avant ton bloc
<Objects>.

2) Plus difficile. Toujours avec l'API DOM de PHP 5, il y a une
propriété DOMDocument->formatOutput qui est censée faire ça quand
elle est mise à true. En pratique, dans tous mes essais, ça ne change
rien. Il doit y avoir un bug quelque part...
Pour contourner ce pb et pouvoir quand même ouvrir les fichiers avec
un éditeur type vi (qui ne supporte pas les lignes trop longues),
j'insère systématiquement deux noeuds 'texte' qui entourent mon
élément. C'est fait par une fonction comme celle-ci :

function MyAppendChild($indent,$parent,$element)
{
$t=$parent->ownerDocument->createTextNode("n".$indent);
$parent->appendChild($t);
$parent->appendChild($element);
$t2=$parent->ownerDocument->createTextNode("n");
$parent->appendChild($t2);
}

Ici, c'est un append, mais tu peux l'adapter à ton cas. Pas génial,
mais je n'ai pas trouvé mieux...
Avatar
fragmonster
Merci pour vos réponses, je vais essayer tout ça ^^