Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > DOM
DOM Forum d'entraide pour l'extension DOM permettant de manipuler des documents XML en PHP 5 (approche DOM). Avant de poster -> tutoriels DOM
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/08/2007, 09h34   #1
Rédacteur
 
Avatar de Yoshio
 
Homme
Inscription : septembre 2005
Messages : 1 741
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 1 741
Points : 1 497
Points : 1 497
Par défaut [DOM] Problème d'indentation/espacement avec un XML

Bonjour,

Je modifie un fichier xml avec DOM.

Mon but est d'ajouter un noeud a la racine <root>.
Je fais donc ce qu'il y a besoin de faire avec appendChild(), createElement() et createTextNode().

Seulement voila, quand je sauvegarde mon fichier avec save() il me fait du mono-ligne
J'ai essayer saveHTMLFile(), ca ne marche pas mieux.

Est ce qu'il y a moyen de lui faire indenter le code ? Sinon ca sert pas a grand chose cette extension si on peux même pas avoir un XML potable apres.


Yoshio.
Yoshio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2007, 11h38   #2
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
L'extension DOM te permet de lire et modifier des fichiers XML, pas de formater le XML pour le rendre lisible par un humain. Ton XML sera lisible par n'importe quele aplication, c'est le principal. Si tu veux avoir du XML indenté, essaie des biblios comme Tidy

Je rappelle que quoi qu'il en soit, ton XML sera lisible par n'importe quelle application.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2007, 11h49   #3
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Et les attributs formatOutput (pour l'écriture) et preserveWhiteSpace (pour la lecture) d'un objet DomDocument ?
Code :
1
2
3
4
5
6
<?php
$doc = new DomDocument;
$doc->formatOutput = TRUE; // Utilisé par les méthodes save* pour formater le document
$doc->preserveWhiteSpace = FALSE; // Utilisé à la lecture pour ignorer ce formatage et ne pas créer de noeuds texte à partir de ceux-ci
$doc->load('mon_fichier.xml');
# ...
Cela dit le sujet est déjà tombé il y a quelques jours
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2007, 12h27   #4
Rédacteur
 
Avatar de Yoshio
 
Homme
Inscription : septembre 2005
Messages : 1 741
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 1 741
Points : 1 497
Points : 1 497
Je vient de tester et ca ne marche pas mieux.

Je veux ajouter :
Code :
1
2
3
4
5
<entry>
    <title>Titre</title>
    <id>id</id>
    <updated>2007</updated>
</entry>
et voila comment il me l'ajoute :
Code :
<entry><id>id:3b918cda56f78aa1996a05a84bc5cb19</id><title>Une autre news de test</title><updated>2007-08-21T11:53:43+02:00</updated></entry>
Le code on sait jamais :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
	// Load Xml
	$dom = new DOMDocument();
	$dom->preserveWhiteSpace = true;
	$dom->formatOutput = false;
	$dom->load('public/feed/news.xml');
 
	// Create element <entry>
	$entryNode = $dom->createElement('entry');
 
	// Create element <id>
	$idNode = $dom->createElement('id');
	$idNodeText = $dom->createTextNode($id);
	$idNode->appendChild($idNodeText);
 
	// Create element <title>
	$titleNode = $dom->createElement('title');
	$titleNodeText = $dom->createTextNode($title);
	$titleNode->appendChild($titleNodeText);
 
	// Create element <updated>
	$updatedNode = $dom->createElement('updated');
	$updatedNodeText = $dom->createTextNode($updated);
	$updatedNode->appendChild($updatedNodeText);
 
	// Add node to <entry>
	$entryNode->appendChild($idNode);
	$entryNode->appendChild($titleNode);
	$entryNode->appendChild($updatedNode);
 
	// Add <entry> to <feed>
	$feed = $dom->getElementsByTagName('feed')->item(0);
	$feed->appendChild($entryNode);
 
	// Save XML to file
	$dom->save('public/feed/news.xml');
Je vais regarder pour Tidy.
Yoshio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2007, 12h28   #5
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
formatOutput = TRUE
Par contre, preservewhitespace ne te sert à rien si tu ne lis pas le doc.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2007, 12h42   #6
Rédacteur
 
Avatar de Yoshio
 
Homme
Inscription : septembre 2005
Messages : 1 741
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 1 741
Points : 1 497
Points : 1 497
Toujours pareille, il m'ecrit tout sur la même ligne dans le fichier.
Yoshio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2007, 13h40   #7
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
echo '<pre>' . $dom->saveXML() . '</pre>'; corrobore-t-il ce fait ? Pourrait-on ravoir les premières lignes corrigées (de l'instanciation à l'appel de load) ?
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2007, 15h25   #8
Rédacteur
 
Avatar de Yoshio
 
Homme
Inscription : septembre 2005
Messages : 1 741
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 1 741
Points : 1 497
Points : 1 497
Avec saveXML c'est pareille, aucun espace ni indentation.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
	// Load Xml
	$dom = new DOMDocument();
	$dom->preserveWhiteSpace = true;
	$dom->formatOutput = true;
	$dom->load('public/feed/news.xml');
 
	// Create element <entry>
	$entryNode = $dom->createElement('entry');
 
	// Create element <id>
	$idNode = $dom->createElement('id');
	$idNodeText = $dom->createTextNode($id);
	$idNode->appendChild($idNodeText);
 
	// Create element <title>
	$titleNode = $dom->createElement('title');
	$titleNodeText = $dom->createTextNode($title);
	$titleNode->appendChild($titleNodeText);
 
	// Create element <updated>
	$updatedNode = $dom->createElement('updated');
	$updatedNodeText = $dom->createTextNode($updated);
	$updatedNode->appendChild($updatedNodeText);
 
	// Add node to <entry>
	$entryNode->appendChild($idNode);
	$entryNode->appendChild($titleNode);
	$entryNode->appendChild($updatedNode);
 
	// Add <entry> to <feed>
	$feed = $dom->getElementsByTagName('feed')->item(0);
	$feed->appendChild($entryNode);
 
	// Save XML to file
	echo '<pre>';
	var_dump($dom->saveXML());	
	echo '</pre>';
résultat :
Code :
1
2
3
4
string(353) "
 
id:0b825253677cc65ea5ab3f90d76eec382007-08-21T12:42:22+02:00id:59fa558e300216817448cb95946bc7b32007-08-21T15:22:00+02:00
"
code source :
Code :
1
2
3
4
5
<pre>string(353) "<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<entry><id>id:0b825253677cc65ea5ab3f90d76eec38</id><title>Une autre news de test</title><updated>2007-08-21T12:42:22+02:00</updated></entry><entry><id>id:59fa558e300216817448cb95946bc7b3</id><title>Une autre news de test</title><updated>2007-08-21T15:22:00+02:00</updated></entry></feed>
"
</pre>
Yoshio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2007, 16h08   #9
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Avec $dom->preserveWhiteSpace = false; ça devrait rentrer dans l'ordre. Les deux à true ne semblent pas faire bon ménage (formatOutput semblant alors être ignoré)
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2007, 17h27   #10
Rédacteur
 
Avatar de Yoshio
 
Homme
Inscription : septembre 2005
Messages : 1 741
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 1 741
Points : 1 497
Points : 1 497
Ah nikel, merci Julp.
Yoshio est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h17.


 
 
 
 
Partenaires

Hébergement Web