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] Parser XML avec balise imbriquée dans contenu (EAD)


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    818
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2005
    Messages : 818
    Points : 288
    Points
    288
    Par défaut [SimpleXML] Parser XML avec balise imbriquée dans contenu (EAD)
    Bonjour,

    Je cherche à parser du xml (norme EAD) mais je n'arrive pas à récupérer le contenu complet des balises lorsqu'elles comportent des balises imbriquées.
    Un exemple sera plus clair. Voici le xml source :
    ...
    <langmaterial>Manuscrits en <language langcode="baq">souletin</language> avec parfois des annotations de Georges Hérelle, ainsi que des errejents en <language langcode="fre">français</language></langmaterial>
    ...
    Cette balise xml génère ceci une fois parsée :
    SimpleXMLElement Object
    (
    ....

    [langmaterial] => Manuscrits en avec parfois des annotations de Georges Hérelle, ainsi que des errejents en
    ....
    )
    Je voudrais que le résultat du parse donne quelque chose comme ceci :
    SimpleXMLElement Object
    (
    ....

    [langmaterial] => Manuscrits en souletin avec parfois des annotations de Georges Hérelle, ainsi que des errejents en français
    [langmaterial] => SimpleXMLElement Object
    (
    [@attributes] => Array
    (
    [langcode] => baq
    )
    [language] => souletin
    [@attributes] => Array
    (
    [langcode] => fre
    )
    [language] => français
    )
    ....
    )
    En fait le but est de récupérer à la fois le texte de la balise langmaterial avec le texte des balises imbriquées d'une part.
    Et de pouvoir lister toutes les balises language d'autre part.

    Quelqu'un aurait une idée ?

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    tu utilises quoi comme code ?

    avec le code suivant par exemple, tu récupère bien les attributs
    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
    $xml = "<s><langmaterial>Manuscrits en <language langcode=\"baq\">souletin</language> avec parfois des annotations de Georges Hérelle, ainsi que des errejents en <language langcode=\"fre\">français</language></langmaterial></s>";
    $resultat = simplexml_load_string($xml);
     
    parcourirSimplexml($resultat, "***");
     
    function parcourirSimplexml(SimpleXMLElement $e, $separateur)
    {
    	foreach ($e->children() as $cle => $enfant) {
    		echo "$separateur<br/>\n";
     
    		var_dump(array(
    			"cle" => $cle,
    			"enfant" => $enfant,
    		));
     
    		if ($enfant->count() > 0) {
    			parcourirSimplexml($enfant, "$separateur***");
    		}
     
    		echo "$separateur<br/>\n";
    	}
    }

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    818
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2005
    Messages : 818
    Points : 288
    Points
    288
    Par défaut
    Mon problème n'est pas de récupérer les attributs.
    J'arrive en trichant à afficher le contenu de la balise.
    J'ai écrit cette fonction qui va détecter les doubles espaces OU apostrophe espace OU espace point OU espace virgule dans le parent et les remplacer par tous les enfants du noeud pour reconstituer le texte sans les balises du noeud parent.
    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
     
    function replace_children($chaine,$terme) {
        $tab_criteres = array(
            array('value'=>'  ',
                'search' => '/  /',
                'replace_start' => ' ',
                'replace_end' => ' '
                ),
            array('value'=>'\' ',
                'search' => '/\' /',
                'replace_start' => '\'',
                'replace_end' => ' '
                ),
            array('value'=>' .',
                'search' => '/ \./',
                'replace_start' => ' ',
                'replace_end' => '.'
                ),
            array('value'=>' ,',
                'search' => '/ ,/',
                'replace_start' => ' ',
                'replace_end' => ','
                )
        );
     
        $tab_critere_pos = array();
        foreach ($tab_criteres as $critere) {
            if (strpos($chaine, $critere['value']) !== False) {
                $tab_critere_pos[strpos($chaine, $critere['value'])] = $critere;
            }
        }
        if (count($tab_critere_pos) == 0) {
            return $chaine;
        }
        ksort($tab_critere_pos);
        $critere_pos = current($tab_critere_pos);
        $chaine = preg_replace($critere_pos['search'], $critere_pos['replace_start'] . $terme . $critere_pos['replace_end'], $chaine, 1);
     
        return $chaine;
    }
    Et je l'utilise comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    if (!empty($noeud->did->langmaterial)) {
                $scope = $noeud->did->langmaterial;
                foreach ($noeud->did->langmaterial->children() as $sous_champs) {
                    $scope = replace_children($scope,$sous_champs);
                }
                if (substr($scope, -1) == " ") {
                    $scope = $scope . $sous_champs;
                }
                echo $scope;
            }
    Mais ce que je souhaiterais c'est par exemple récupérer le contenu de la balise langmaterial complet (avec les balises language) et appliquer un strip_tags sur cette chaine pour ne récupérer que le texte.

Discussions similaires

  1. Fichier XML avec caractère spécial dans balise
    Par RobKris63 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 31/01/2018, 20h25
  2. Parser flux xml avec balises sur plusieurs niveaux
    Par Freedolphin dans le forum XQUERY/SGBD
    Réponses: 3
    Dernier message: 19/09/2011, 15h39
  3. Parser flux XML avec balise contenant ":" génère une erreur
    Par Pierrick81 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 22/08/2011, 19h19
  4. Probleme avec balise taglib dans web.xml
    Par slimak dans le forum JSF
    Réponses: 1
    Dernier message: 04/06/2009, 15h44
  5. generer xsl depuis xml avec balises inconues ?
    Par cedre dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 24/06/2003, 09h00

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