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 04/11/2007, 16h11   #1
Invité de passage
 
Inscription : octobre 2006
Messages : 8
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 8
Points : 3
Points : 3
Par défaut [DOM] balise auto fermante

Bonjour,

je galère sur le problème depuis plusieurs jours:
J'ai un document xml contenant des balises vides (mais susceptibles d'être remplies) écrites sous forme régulière et pas autofermante.

exemple, la balise Idn_Confidentialite:

Code :
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="iso-8859-1"?>
<anomalie xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="exportsst.xsd">
<fiche identifiantFiche="ADEL00020146" state="Decidée" datedernieremodif="2007-06-22 18:04:18">
<Identification>
<Idn_DateCreation>2006-01-25 00:00:00</Idn_DateCreation>
<Idn_Confidentialite></Idn_Confidentialite>
<Idn_TypeFiche>Anomalie</Idn_TypeFiche>
...
J'ouvre mon doc:

Code :
1
2
3
4
5
6
7
8
9
 
 
  $uploadfile1 = "ref.xml";
  $olddoc = new domDocument;
  if (file_exists($uploadfile1)) {
  $olddoc->load($uploadfile1);
  } else {
  exit('Erreur !.');
  }
Je fais des traitements sur mon document, avec copie de nœuds vers un document result_doc.
Lorsque je resauve mon fichier xml avec la méthode save:

Code :
1
2
 
echo 'Wrote: ' . $result_doc->save("./downloads/result.xml") . ' bytes';
toutes les balises vides sont sauvées sous forme autofermante, ce qui est génant parceque mon fichier doit etre traité par d'autres outils et garder la meme forme.

Code :
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="iso-8859-1"?>
<anomalie xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="exportsst.xsd">
<fiche identifiantFiche="ADEL00020146" state="Decidée" datedernieremodif="2007-06-22 18:04:18">
<Identification>
<Idn_DateCreation>2006-01-25 00:00:00</Idn_DateCreation>
<Idn_Confidentialite/>
<Idn_TypeFiche>Anomalie</Idn_TypeFiche>
Si je fais la sauvegarde avec la methode saveHTMLFile, le format est correct, par contre la 1ere ligne avec la balise <xml...> est supprimée et les accents sont encodés:

Code :
1
2
3
4
5
6
7
8
// ici il manque la 1ere ligne
<anomalie xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="exportsst.xsd">
<fiche identifiantFiche="ADEL00020146" state="Decid&eacutee" datedernieremodif="2007-06-22 18:04:18">
<Identification>
<Idn_DateCreation>2006-01-25 00:00:00</Idn_DateCreation>
<Idn_Confidentialite></Idn_Confidentialite>
<Idn_TypeFiche>Anomalie</Idn_TypeFiche>
J'ai beau chercher, je ne trouve pas de propriété qui définisse sous quelle forme sauver les balises vides, et je voudrais éviter d'avoir à bidouiller le fichier résultat à postériori pour retransformer les balises.

Quelqu'un a déjà eu ce problème?
Merci par avance.
ymerdy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2007, 16h32   #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
A priori, je dirais, d'après la documentation de l'extension DOM :
Code :
echo 'Wrote: ' . $result_doc->save("./downloads/result.xml", LIBXML_NOEMPTYTAG) . ' bytes';
Mais normalement pour un vrai parser XML ça ne change rien

Par contre pourquoi utiliser la méthode saveHTMLFile (surtout que ce n'est pas elle qui est montrée dans votre code) ?
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2007, 19h34   #3
Invité de passage
 
Inscription : octobre 2006
Messages : 8
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 8
Points : 3
Points : 3
Super, je n'avais pas vu cette option dans la doc de la methode save.
Merci beaucoup.

La sauvegarde avec saveHTMLFile, c'était juste un essai pour voir le contenu du fichier créé et comprendre la différence avec save.

Par contre, il me reste un probleme avec appendChild, à savoir que les noeuds sont empilés sans retour charriot entre chaque.

Je charge un fichier qui a la structure suivante:
un noeud racine <anomalie>
contenant des noeuds enfants <fiche>

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
 
<?xml version="1.0" encoding="iso-8859-1"?>
<anomalie xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="exportsst.xsd">
<fiche identifiantFiche="ADEL00020146" state="Decidee" datedernieremodif="2007-06-22 18:04:18">
<Identification>
<Idn_DateCreation>2006-01-25 00:00:00</Idn_DateCreation>
<Idn_Confidentialite></Idn_Confidentialite>
<Idn_TypeFiche>Anomalie</Idn_TypeFiche>
<Idn_Visibilite>none</Idn_Visibilite>
<Idn_Redacteur>DUPONT Hervé DCN</Idn_Redacteur>
<Der_Observations></Der_Observations>
</Identification>
</fiche>
<fiche identifiantFiche="ADEL00020161" state="Decidee" datedernieremodif="2007-06-22 17:51:50" >
<Identification>
<Idn_DateCreation>2006-01-25 00:00:00</Idn_DateCreation>
<Idn_Confidentialite></Idn_Confidentialite>
<Idn_TypeFiche>Anomalie</Idn_TypeFiche>
<Idn_Visibilite>none</Idn_Visibilite>
<Idn_Redacteur>DUPONT Hervé DCN</Idn_Redacteur>
<Der_Observations></Der_Observations>
</Identification>
</fiche>
</anomalie>
mon script a pour objet de modifier des attributs et valeurs de noeuds de chaque fiche.
Le résultat est copié dans un document $result_doc de la maniere suivante (importNode puis appendChild):

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  $uploadfile1 = "./uploads/test1.xml";
  $olddoc = new domDocument;
  if (file_exists($uploadfile1)) {
  $olddoc->load($uploadfile1);
  } else {
  exit('Erreur !.');
  }
  $resultfiches = $olddoc->getElementsByTagName('fiche');
 
  $result_doc = new DOMDocument('1.0', 'iso-8859-1'); //Choose encoding to iso-8859-1
  //$result_doc->formatOutput = true;
  $result_root = $result_doc->createElement('anomalie');
  $result_doc->appendChild($result_root);
 
  $fichesroot = $result_doc->getElementsByTagName('anomalie')->item(0);
  foreach ($resultfiches as $fiche_name=>$oldnode)
  {
    $domNode = $result_doc->importNode($oldnode, true);
    $fichesroot->appendChild($domNode);
  }
 
echo 'Wrote: ' . $result_doc->save("./downloads/test1.xml",LIBXML_NOEMPTYTAG) . ' bytes';
Le probleme est que le fichier résultat a la forme suivante:
chaque nouvelle balise <fiche> est accollée à la balise fermante du noeud précédent:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="iso-8859-1"?>
<anomalie><fiche identifiantFiche="ADEL00020146" state="Decidee" datedernieremodif="2007-06-22 18:04:18">
<Identification>
<Idn_DateCreation>2006-01-25 00:00:00</Idn_DateCreation>
<Idn_Confidentialite></Idn_Confidentialite>
<Idn_TypeFiche>Anomalie</Idn_TypeFiche>
<Idn_Visibilite>none</Idn_Visibilite>
<Idn_Redacteur>DUPONT Hervé DCN</Idn_Redacteur>
<Der_Observations></Der_Observations>
</Identification>
</fiche><fiche identifiantFiche="ADEL00020161" state="Decidee" datedernieremodif="2007-06-22 17:51:50">
<Identification>
<Idn_DateCreation>2006-01-25 00:00:00</Idn_DateCreation>
<Idn_Confidentialite></Idn_Confidentialite>
<Idn_TypeFiche>Anomalie</Idn_TypeFiche>
<Idn_Visibilite>none</Idn_Visibilite>
<Idn_Redacteur>DUPONT Hervé DCN</Idn_Redacteur>
<Der_Observations></Der_Observations>
</Identification>
</fiche></anomalie>
je voudrais avoir chaque balise <fiche> qui soit sur une nouvelle ligne.
J'ai essayé de positionner formatOutput=true, c'est presque bon sauf que en plus du retotr-charriot, j'ai une indentation devant la balise...
ymerdy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2007, 19h40   #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
L'option de formatage de DOM c'est du tout ou rien (espaces ET retours chariot) : c'est préétabli. Si vous voulez le faire à votre façon il vous revient de créer puis d'ajouter les noeuds textuels qui convient
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2007, 22h53   #5
Invité de passage
 
Inscription : octobre 2006
Messages : 8
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 8
Points : 3
Points : 3
OK, merci pour ces réponses.
J'ajoute manuellement un noeud text contenant un caractere NewLine aprés chaque noeud <fiche> et tout marche comme je le voulais.

Merci.
ymerdy 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 04h50.


 
 
 
 
Partenaires

Hébergement Web