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 16/08/2007, 04h07   #1
Nouveau Membre du Club
 
Avatar de eexit
 
Étudiant
Inscription : juillet 2007
Messages : 61
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2007
Messages : 61
Points : 35
Points : 35
Par défaut [DOM] Conserver la structure avec formatOutput

Bonjour,

J'ai un fichier XML qui contient déjà des données et lorsque j'en ajoute, je voudrais réutiliser la methode formatOutput de l'object DOMDocument mais rien n'y fait, les noeuds sont ajoutés en vrac à la ligne...

Voici ma classe :
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
38
39
40
41
42
43
44
45
46
47
48
<?php
class user
{
	private $xml, $root;
	private $user_id, $user_pseudo, $user_pwd, $user_name, $user_email, $user_right;
	private $new_id, $new_pseudo, $new_pwd, $new_name, $new_email, $new_right;
 
	function __construct()
	{
 
		$this->xml = new DOMDocument();
		$this->xml->formatOutput = true;
		$this->xml->load('users.xml');
		$this->root = $this->xml->getElementsByTagName('root_users')->item(0); //element racine
	}
 
	private function createNodes()
	{
		$new_user 		= $this->root->appendChild($this->xml->createElement('user'));
		$this->user_id 		= $new_user->appendChild($this->xml->createElement('user_id'));
		$this->user_pseudo 	= $new_user->appendChild($this->xml->createElement('user_pseudo'));
		$this->user_pwd		= $new_user->appendChild($this->xml->createElement('user_pwd'));
		$this->user_name 	= $new_user->appendChild($this->xml->createElement('user_name'));
		$this->user_email 	= $new_user->appendChild($this->xml->createElement('user_email'));
		$this->user_right 	= $new_user->appendChild($this->xml->createElement('right_id'));
	}
 
	private function addDatas()
	{
		$this->new_id 		= $this->user_id->appendChild($this->xml->createTextNode('2'));
		$this->new_pseudo 	= $this->user_pseudo->appendChild($this->xml->createTextNode('pseudo'));
		$this->new_pwd	 	= $this->user_pwd->appendChild($this->xml->createTextNode('ede0f9c154d2093e3f48fcafd3c70915'));
		$this->new_name 	= $this->user_name->appendChild($this->xml->createTextNode('Name'));
		$this->new_email 	= $this->user_email->appendChild($this->xml->createTextNode('email@domain.tld'));
		$this->new_right 	= $this->user_right->appendChild($this->xml->createTextNode('1'));
	}
 
	function add_user()
	{
		$this->createNodes();
		$this->addDatas();
		echo $this->xml->saveXML();
	}
}
 
$new_user = new user();
$new_user->add_user();
?>
Et voici ce que j'obtiens quand j'affiche la source :
Code XML :
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="UTF-8"?>
<root_users>
  <user>
    <user_id>1</user_id>
    <user_pseudo>pseudo</user_pseudo>
    <user_pwd>ede0f9c3a1d20fcafd3c70915</user_pwd>
    <user_name>Name</user_name>
    <user_email>email@domain.tld</user_email>
    <right_id>1</right_id>
  </user>
<user><user_id>2</user_id><user_pseudo>pseudo</user_pseudo><user_pwd>ede0f9c154d2093e3f48fcafd3c70915</user_pwd><user_name>Name</user_name><user_email>email@domain.tld</user_email><right_id>1</right_id></user></root_users>

Si quelqu'un connait la solution, j'en serais ravis sachant que je n'ai pas encore commencé à apprendre le XSLT.

Merci beaucoup.
eexit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2007, 11h28   #2
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 en utilisant la propriété preserveWhiteSpace (avant l'appel à load) :
Code :
$this->xml->formatOutput = FALSE;
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2007, 15h31   #3
Nouveau Membre du Club
 
Avatar de eexit
 
Étudiant
Inscription : juillet 2007
Messages : 61
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2007
Messages : 61
Points : 35
Points : 35
Code :
1
2
3
4
5
6
7
8
9
function __construct()
	{
 
		$this->xml = new DOMDocument();
		$this->xml->preserveWhiteSpace = false;
		$this->xml->formatOutput = true;
		$this->xml->load('users.xml');
		$this->root = $this->xml->getElementsByTagName('root_users')->item(0);
	}
Yes, ça fonctionne !

Merci beaucoup !!

Par contre, je viens de me rendre compte d'une anormalitée : quand j'éxécute plusieurs fois la méthode $new_user->add_user(); j'obtiens ceci dans mon code :
Code XML :
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//pour 3 éxécutions :
<?xml version="1.0" encoding="UTF-8"?>
<root_users>
  <user>
    <user_id>1</user_id>
    <user_pseudo>pseudo</user_pseudo>
    <user_pwd>root_usersede0f9c3a1d2093e3f48f8546fd3c70915</user_pwd>
    <user_name>Name</user_name>
    <user_email>email@domain.tdl</user_email>
 
    <right_id>1</right_id>
  </user>
  <user>
    <user_id>1</user_id>
    <user_pseudo>pseudo</user_pseudo>
    <user_pwd>root_usersede0f9c3a1d2093e3f48f8546fd3c70915</user_pwd>
    <user_name>Name</user_name>
 
    <user_email>email@domain.tdl</user_email>
    <right_id>1</right_id>
  </user>
</root_users>
<?xml version="1.0" encoding="UTF-8"?>
<root_users>
  <user>
    <user_id>1</user_id>
    <user_pseudo>pseudo</user_pseudo>
 
    <user_pwd>root_usersede0f9c3a1d2093e3f48f8546fd3c70915</user_pwd>
    <user_name>Name</user_name>
    <user_email>email@domain.tdl</user_email>
    <right_id>1</right_id>
  </user>
  <user>
    <user_id>1</user_id>
 
    <user_pseudo>pseudo</user_pseudo>
    <user_pwd>root_usersede0f9c3a1d2093e3f48f8546fd3c70915</user_pwd>
    <user_name>Name</user_name>
    <user_email>email@domain.tdl</user_email>
    <right_id>1</right_id>
  </user>
 
  <user>
    <user_id>1</user_id>
    <user_pseudo>pseudo</user_pseudo>
    <user_pwd>root_usersede0f9c3a1d2093e3f48f8546fd3c70915</user_pwd>
    <user_name>Name</user_name>
    <user_email>email@domain.tdl</user_email>
 
    <right_id>1</right_id>
  </user>
</root_users>
<?xml version="1.0" encoding="UTF-8"?>
<root_users>
  <user>
    <user_id>1</user_id>
    <user_pseudo>pseudo</user_pseudo>
    <user_pwd>root_usersede0f9c3a1d2093e3f48f8546fd3c70915</user_pwd>
 
    <user_name>Name</user_name>
    <user_email>email@domain.tdl</user_email>
    <right_id>1</right_id>
  </user>
  <user>
    <user_id>1</user_id>
    <user_pseudo>pseudo</user_pseudo>
 
    <user_pwd>root_usersede0f9c3a1d2093e3f48f8546fd3c70915</user_pwd>
    <user_name>Name</user_name>
    <user_email>email@domain.tdl</user_email>
    <right_id>1</right_id>
  </user>
  <user>
    <user_id>1</user_id>
 
    <user_pseudo>pseudo</user_pseudo>
    <user_pwd>root_usersede0f9c3a1d2093e3f48f8546fd3c70915</user_pwd>
    <user_name>Name</user_name>
    <user_email>email@domain.tdl</user_email>
    <right_id>1</right_id>
  </user>
 
  <user>
    <user_id>1</user_id>
    <user_pseudo>pseudo</user_pseudo>
    <user_pwd>root_usersede0f9c3a1d2093e3f48f8546fd3c70915</user_pwd>
    <user_name>Name</user_name>
    <user_email>email@domain.tdl</user_email>
 
    <right_id>1</right_id>
  </user>
</root_users>
eexit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2007, 15h48   #4
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 comment le sauvegardez/manipulez-vous ce document ?

Note :
Code :
$this->root = $this->xml->getElementsByTagName('root_users')->item(0);
Peut être simplifié en :
Code :
$this->root = $this->xml->documentElement;
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2007, 16h41   #5
Nouveau Membre du Club
 
Avatar de eexit
 
Étudiant
Inscription : juillet 2007
Messages : 61
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2007
Messages : 61
Points : 35
Points : 35
Ok, merci pour l'optimisation

Actuellement, je ne sauvegarde pas le fichier, j'affiche juste le résultat en XML de cette manière :
Code :
1
2
3
4
5
<?php
echo '<pre>';
echo $this->xml->saveXML();
echo '</pre>';
?>
Ou sinon quand je sauvegarde, je fais ceci :
Code :
1
2
3
<?php
$this->xml->save('monfichierxml.xml');
?>
Ok, jusqu'à présent, je ne sauvegardais pas le fichier XML, j'affichais seulement le résultat et à l'instant, je viens de me rendre compte que le résultat affiché n'est pas du tout celui obtenu que celui de la sauvegarde fichier.

Donc, mon problème est résolu mais il est tout de même bizarre que l'affichage du XML ne soit pas celui attendu.

Je vous remercie beaucoup pour votre aide.

~jb.
eexit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2007, 11h52   #6
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
Si je puis me permettre un commentaire, ne serait-il pas intéressant de faire une classe dérivée plutôt que d'avoir une propriété $xml dans l'objet ?

Code :
class User extends DOMDocument
__________________
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
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h48.


 
 
 
 
Partenaires

Hébergement Web