Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > SimpleXML
SimpleXML Forum d'entraide pour l'extension SimpleXML, qui permet de manipuler des documents XML en PHP (approche 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 12/08/2008, 23h28   #1
Nouveau Membre du Club
 
Inscription : août 2005
Messages : 114
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 114
Points : 26
Points : 26
Par défaut Récupérer l'arborescence d'un fichier XML

Bonsoir tout le monde,
Je vous expose mon problème. Je cherche à remplacer tous les 60 ans qui se trouvent dans les balises <p> de mon fichier XML en 150 ans. J'arrive à trouver les valeurs qui se trouvent dans la balise <p> et maintenant je voudrais les remplacer. Pour ce faire, il faut que je trouve l'arborescence de ces balises. Est-ce que quelqu'un connaître une façon de le faire svp ?
Voici mon fichier xml simplifié :
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
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
94
95
96
97
98
99
100
101
102
103
104
105
 
<c id="tt1-7" level="series">
 
        <did>
          <unittitle type="titre">niveau de titre 1</unittitle>
        </did>
 
        <c id="tt2-5" level="subseries">
 
          <did>
            <unittitle type="titre">Niveau de titre 2</unittitle>
          </did>
 
 
          <c id="de-40" level="file">
            <did>
              <unitid>40</unitid>
 
              <unittitle>Intitulé</unittitle>
 
              <unitdate normal="1940/1946">1940-1946</unitdate>
            </did>
          </c>
 
 
 
            <c id="de-13" level="file">
              <did>
                <unitid>13</unitid>
 
                <unittitle>Intitulé</unittitle>
 
                <unitdate normal="1955/1956">1955-1956</unitdate>
 
              </did>
 
              <accessrestrict>
                <accessrestrict type="delai">
                  <head>Délai</head>
 
                  <p>150 ans</p>
                </accessrestrict>
 
                <accessrestrict type="com">
                  <head>communication</head>
 
                  <p>2107</p>
                </accessrestrict>
              </accessrestrict>
            </c>
	</c>
</c>
 
 
 
 
 <c id="tt1-7" level="series">
 
        <did>
          <unittitle type="titre">niveau de titre 1</unittitle>
        </did>
 
        <c id="tt2-5" level="subseries">
 
          <did>
            <unittitle type="titre">Niveau de titre 2</unittitle>
          </did>
 
 
        	<c id="tt2-5" level="subseries">
 
        	  <did>
        	    <unittitle type="titre">Niveau de titre 3</unittitle>
        	  </did>
 
 
            <c id="de-14" level="file">
              <did>
                <unitid>14</unitid>
 
                <unittitle>Intitulé</unittitle>
 
                <unitdate normal="1955/1956">1955-1956</unitdate>
 
              </did>
 
              <accessrestrict>
                <accessrestrict type="delai">
                  <head>Délai</head>
 
                  <p>150 ans</p>
                </accessrestrict>
 
                <accessrestrict type="com">
               <head>communication</head>
 
                  <p>2107</p>
                </accessrestrict>
              </accessrestrict>
            </c>
 
            </c>
 
	</c>
</c>
Et voici mon code (ce qu'il me manque est symbolisé par ça ????? )
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
 
<?php 
$xml = simplexml_load_file('fichiersxml/test.xml');
$xpathXml = $xml->xpath('//p');
 
foreach($xpathXml as $balisesP[$i]) //On cherche les balises P et on boucle dessus
{
	$baliseEnCours = $balisesP[$i];
	if(preg_match("#^[0-9]+\s+ans#", $baliseEnCours)) //Si ça répond à la forme 0123456789 ans (exemple : 120 ans ou 2 ans ....)
	{
		if($baliseEnCours == "60 ans")
		{
			//Ici on veut pouvoir modifier le bon <p> avec la nouvelle valeur
			$baliseRetournee = "90 ans<br>";	
			$smpXML->???????? = $baliseRetournee;
		}
	}
}
//On réécrit le fichier xml avec les nouvelles valeurs modifiées
$return = $smpXML->asXML();
$fp = fopen('fichiersxml/test.xml', 'w+');
fwrite($fp, $return);
fclose($fp);
 
?>
Merci beaucoup pour votre aide.
rob2-9 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2008, 03h55   #2
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 835
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 835
Points : 3 468
Points : 3 468
Amha tu peux faire plus simple.
Remplacer le contenu des balises <p> ayant pour valeur "60 ans" par "150 ans" :

Code :
1
2
3
4
$result = $xml->xpath('//p[text()="60 ans"]') ;
foreach ( $result as $node ) {
    $node[0] = '150 ans' ;
}
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2008, 06h54   #3
Nouveau Membre du Club
 
Inscription : août 2005
Messages : 114
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 114
Points : 26
Points : 26
ah oui c'est sur c'est beaucoup plus simple comme ça !! Par contre je ne vois pas du coup comment enregistrer cette nouvelle valeur dans mon fichier.
J'avais trouver cela :
//On réécrit le fichier xml avec les nouvelles valeurs modifiées
$return = $smpXML->asXML();
$fp = fopen('fichiersxml/test.xml', 'w+');
fwrite($fp, $return);
fclose($fp);

Seulement ici je ne vois pas comment utiliser cette méthode car je ne vois pas quoi mettre dans $smpXML->???

Merci beaucoup pour ton aide
rob2-9 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2008, 12h20   #4
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 835
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 835
Points : 3 468
Points : 3 468
Fais plutôt $xml->asXML( )
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2008, 12h41   #5
Nouveau Membre du Club
 
Inscription : août 2005
Messages : 114
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 114
Points : 26
Points : 26
OK seulement cela n'enregistre rien dans le fichier parce que je ne sais pas où placer le $baliseRetournee. Dans quoi il faudrait indiquer que l'on doit prendre cette modif en compte et l'enregistrer dans le fichier ?
Merci pour ton aide
rob2-9 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2008, 22h36   #6
Nouveau Membre du Club
 
Inscription : août 2005
Messages : 114
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 114
Points : 26
Points : 26
Bonsoir,

j'ai fais plusieurs essais toujours sans résultat.

Voici exactement ce que je souhaite faire

1) Charger un fichier XML (OK)
2) Rechercher toutes les balises <p> (OK)
3) Modifier certaines de ces balises (NOK)
4) Réécrire le fichier XML comme il était au début en tenant compte des balises <p> modifiées. (NOK)

----------
Voici mon code avec lequel je ne parviens qu'à atteindre les 2 premières étapes citées ci-dessus.
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
$xml = simplexml_load_file('fichiersxml/test.xml');
$xpathXml = $xml->xpath('//p'); //On cherche les balises <p>
 
foreach($xpathXml as $balisesP[$i]) //On boucle sur les balises <p>
{
	$baliseEnCours = $balisesP[$i];
	if(preg_match("#^[0-9]+\s+ans#", $baliseEnCours)) //Si ça répond à la forme 0123456789 ans (exemple : 120 ans ou 2 ans ....)
	{ 
		if($baliseEnCours == "60 ans") //Ici on veut pouvoir modifier le bon <p> avec la nouvelle valeur
		{
			//Ici je souhaite dire que la nouvelle valeur de cette balise sera de 90 ans
		}
 
		if($baliseEnCours == "150 ans")
		{
			//Ici je souhaite dire que la nouvelle valeur de cette balise sera de 120 ans
		} 
	} 
}  
echo $return = $xml->asXML(); //Là je réussis à réafficher mon xml comme il était au début mais pas avec les nouvelles valeurs
 
//On réécrit le fichier xml avec les nouvelles valeurs modifiées
$fp = fopen('fichiersxml/test2.xml', 'w+');
fwrite($fp, $return);
fclose($fp);
-------------
Le gros souci c'est que je n'arrive pas à récupérer l'arborescence (l'endroit) où se trouve ma valeur que je change.
N'y a-t-il pas une fonction qui travaille avec Xpath et qui me ramènerait exactement le chemin xml du style :
Citation:
archdesc->dsc->c->c->...->p
Merci d'avance de votre aide
rob2-9 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2008, 12h52   #7
Nouveau Membre du Club
 
Inscription : août 2005
Messages : 114
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 114
Points : 26
Points : 26
Problème résolu avec DOMXml au lieu de simpleXML.
rob2-9 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 05h01.


 
 
 
 
Partenaires

Hébergement Web