IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[SimpleXML] Récupérer l'arborescence d'un fichier XML


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 114
    Points : 60
    Points
    60
    Par défaut [SimpleXML] 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 224
    Points
    8 224
    Billets dans le blog
    17
    Par défaut
    Amha tu peux faire plus simple.
    Remplacer le contenu des balises <p> ayant pour valeur "60 ans" par "150 ans" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  3. #3
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 114
    Points : 60
    Points
    60
    Par défaut
    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

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 224
    Points
    8 224
    Billets dans le blog
    17
    Par défaut
    Fais plutôt $xml->asXML( )
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  5. #5
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 114
    Points : 60
    Points
    60
    Par défaut
    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

  6. #6
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 114
    Points : 60
    Points
    60
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    archdesc->dsc->c->c->...->p
    Merci d'avance de votre aide

  7. #7
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 114
    Points : 60
    Points
    60
    Par défaut
    Problème résolu avec DOMXml au lieu de simpleXML.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer des infos d'un fichier xml ?
    Par OtObOx dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 06/02/2006, 17h53
  2. [XSL]récupérer une valeur de plusieurs fichiers XML
    Par snoop dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 05/02/2006, 00h32
  3. Récupérer du texte d'un fichier xml entre deux balises
    Par manutudescends dans le forum Format d'échange (XML, JSON...)
    Réponses: 24
    Dernier message: 30/11/2005, 18h29
  4. [](VB) Récupérer les données dans un fichier .xml
    Par Furius dans le forum VBScript
    Réponses: 4
    Dernier message: 02/10/2005, 20h39
  5. [SimpleXML] Comment faire pour transformer un fichier XML en PHP ?
    Par magic8392 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 23/09/2005, 16h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo