Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 02-02-2014 17:17:33

coremuch
Nouveau membre
Date d'inscription: 02-02-2014
Messages: 4

Zend_Config_Xml - récupérer valeur depuis un tag avec attribut

Bonjour,

Après de nombreuses recherches sur le net, je n'ai toujours pas réussi a trouver une réponse à mon problème.

Je dois extraire des données d'un fichier XML et j'ai choisi d'utiliser Zend_Config_Xml pour cela.
J'arrive à extraire facilement des données mais en revanche je n'arrive pas à extraire une valeur qui provient d'un tag possédant un attribut.

Voici le type de fichier XML d'entrée:

<element>
       <premier>
            <id>1234</id>
            <nom lang="fr">mon article</nom>
       </premier>
</element>

Pour extraire l'id, je fais:

$xml = new Zend_Config_Xml('monfichier.xml', 'element');
$xml->premier->id //affiche 1234

En revanche "$xml->premier->nom" ne fonctionne pas.
En faisant un toArray(), cela ne me recupère que "lang"...

Pouvez vous m'aider s'il vous plait ?

Je vous remercie par avance.

Dernière modification par coremuch (02-02-2014 17:19:44)

Hors ligne

 

#2 03-02-2014 04:26:17

Alkaest
Nouveau membre
Date d'inscription: 30-01-2014
Messages: 8

Re: Zend_Config_Xml - récupérer valeur depuis un tag avec attribut

Bonjour.

Un problème bien amusant, j'ai passé une bonne demi-heure dessus...

Je vais essayer d'expliquer de façon assez large le problème.

Mon fichier xml :

Code:

[lang=xml]<?xml version="1.0" encoding="UTF-8"?>
<element>
       <premier>
            <id>1234</id>
            <nom lang="fr">mon article</nom>
       </premier>
</element>

Bon, vu que chez moi c'est un test, j'ai travaillé de façon super crado dans mon indexAction...

Premier essai :

Code:

[lang=php]$xml = new Zend_Config_Xml('test.xml');
echo $xml->premier->id . '<br />';
echo $xml->premier->nom;

Résultat :

Code:

1234

Catchable fatal error: Object of class Zend_Config could not be converted to string blablabla

Effectivement, l'id affiche 1234, mais le nom donne une erreur étrange... L'erreur nous dit qu'on fait un echo d'un objet Zend_Config Oo.

Faisons un petit dump pour vérifier la chose :

Code:

[lang=php]Zend_Debug::dump($xml); //Gros dump de l'ensemble

Résultat :

Code:

[lang=php]object(Zend_Config_Xml)#19 (9) {
  ["_skipExtends":protected] => bool(false)
  ["_allowModifications":protected] => bool(false)
  ["_index":protected] => int(0)
  ["_count":protected] => int(1)
  ["_data":protected] => array(1) {
    ["premier"] => object(Zend_Config)#21 (8) {
      ["_allowModifications":protected] => bool(false)
      ["_index":protected] => int(0)
      ["_count":protected] => int(2)
      ["_data":protected] => array(2) {
        ["id"] => string(4) "1234"
        ["nom"] => object(Zend_Config)#39 (8) {
          ["_allowModifications":protected] => bool(false)
          ["_index":protected] => int(0)
          ["_count":protected] => int(1)
          ["_data":protected] => array(1) {
            ["lang"] => string(2) "fr"
          }
          ["_skipNextIteration":protected] => NULL
          ["_loadedSection":protected] => NULL
          ["_extends":protected] => array(0) {
          }
          ["_loadFileErrorStr":protected] => NULL
        }
      }
      ["_skipNextIteration":protected] => NULL
      ["_loadedSection":protected] => NULL
      ["_extends":protected] => array(0) {
      }
      ["_loadFileErrorStr":protected] => NULL
    }
  }
  ["_skipNextIteration":protected] => NULL
  ["_loadedSection":protected] => NULL
  ["_extends":protected] => array(0) {
  }
  ["_loadFileErrorStr":protected] => NULL
}

[Ligne 13] Effectivement, pour une raison étrange, le nom s'est transformé en objet Zend_Config. On peut facilement deviner que c'est à cause du paramètre qui a été ajouté.

Testons... Je retire l'attribut.

Code:

[lang=xml]<?xml version="1.0" encoding="UTF-8"?>
<element>
       <premier>
            <id>1234</id>
            <nom>mon article</nom>
       </premier>
</element>

Code:

[lang=php]Zend_Debug::dump($xml); //Gros dump de l'ensemble

Code:

[lang=php]object(Zend_Config_Xml)#19 (9) {
  ["_skipExtends":protected] => bool(false)
  ["_allowModifications":protected] => bool(false)
  ["_index":protected] => int(0)
  ["_count":protected] => int(1)
  ["_data":protected] => array(1) {
    ["premier"] => object(Zend_Config)#21 (8) {
      ["_allowModifications":protected] => bool(false)
      ["_index":protected] => int(0)
      ["_count":protected] => int(2)
      ["_data":protected] => array(2) {
        ["id"] => string(4) "1234"
        ["nom"] => string(11) "mon article"
      }
      ["_skipNextIteration":protected] => NULL
      ["_loadedSection":protected] => NULL
      ["_extends":protected] => array(0) {
      }
      ["_loadFileErrorStr":protected] => NULL
    }
  }
  ["_skipNextIteration":protected] => NULL
  ["_loadedSection":protected] => NULL
  ["_extends":protected] => array(0) {
  }
  ["_loadFileErrorStr":protected] => NULL
}

L'objet s'est transformé en string. J'ai bon.

A partir de là, une question se pose. Est-il possible de récupérer la valeur "mon article" à l'intérieur de l'objet Zend_Config? Je remet l'attribut à sa place, et repars pour un dump, cette fois-ci ciblé directement sur l'objet Zend_Config.

Code:

[lang=php]Zend_Debug::dump($xml->premier->nom); //Dump ciblé sur le nom

Code:

[lang=php]object(Zend_Config)#39 (8) {
  ["_allowModifications":protected] => bool(false)
  ["_index":protected] => int(0)
  ["_count":protected] => int(1)
  ["_data":protected] => array(1) {
    ["lang"] => string(2) "fr"
  }
  ["_skipNextIteration":protected] => NULL
  ["_loadedSection":protected] => NULL
  ["_extends":protected] => array(0) {
  }
  ["_loadFileErrorStr":protected] => NULL
}

Je constate que je peux récupérer la valeur lang, mais "mon article" semble avoir complètement disparu...

A partir de toutes ces constatations, et d'un petit passage dans la doc (http://framework.zend.com/manual/1.12/e … s.xml.html), je me rend compte que Zend_Config est un peu limitatif sur le format de ses fichiers xml.

En fait, le problème auquel tu fais face est que tu ne peux pas combiner dans le même élément un attribut ET une valeur.

Mon avis serait donc de revoir la structure de ton fichier xml, de sorte que tu obtiennes l'un des deux cas suivants :

Cas n°1 : sympa dans le cas où il y a beaucoup de langues.

Code:

[lang=xml]<?xml version="1.0" encoding="UTF-8"?>
<element>
       <premier>
            <id>1234</id>
            <nom>
                <lang> <!-- balise pas nécessairement utile -->
                    <fr>mon article</fr>
                </lang>
            </nom>
       </premier>
</element>

Cas n°2 :

Code:

[lang=xml]<?xml version="1.0" encoding="UTF-8"?>
<element>
       <premier>
            <id>1234</id>
            <nom lang="fr" value="mon article"></nom>
       </premier>
</element>

Voila, en espérant t'avoir éclairé sans t'effrayer.

Peut-être qu'il existe une autre solution, et peut-être aussi que je me trompe en disant que Zend_Config semble limitatif... je ne suis pas encore passé maître dans l'utilisation du ZF. Donc mieux vaut ne pas prendre ce que je dis pour vérité absolue.

Dernière modification par Alkaest (03-02-2014 04:30:04)

Hors ligne

 

#3 03-02-2014 09:52:41

coremuch
Nouveau membre
Date d'inscription: 02-02-2014
Messages: 4

Re: Zend_Config_Xml - récupérer valeur depuis un tag avec attribut

Merci pour ta réponse mais le problème c'est que je ne peux malheureusement pas changer la structure du fichier XML.
Celui-ci est transmis par un organisme et mon code doit réussir à extraire les données dans modifier la structure XML. Le fichier est conséquent et beaucoup de balises possèdent des attributs. Je ne peux pas m'amuser à restructurer tout le fichier qui fait environ 4000lignes...
J'avais déjà pensé à cette solution et c'est d'ailleurs celle que j'ai pu lire sur le net mais cela ne convient pas dans mon cas sad

Quelqu'un a t-il une autre idée ?

Dernière modification par coremuch (03-02-2014 09:53:29)

Hors ligne

 

#4 03-02-2014 11:50:55

coremuch
Nouveau membre
Date d'inscription: 02-02-2014
Messages: 4

Re: Zend_Config_Xml - récupérer valeur depuis un tag avec attribut

Alkaest a écrit:

Moi moi! (ça vient je suis en train de l'écrire :p)

je t'attends alors :p

Hors ligne

 

#5 03-02-2014 15:35:32

Alkaest
Nouveau membre
Date d'inscription: 30-01-2014
Messages: 8

Re: Zend_Config_Xml - récupérer valeur depuis un tag avec attribut

Je lutte comme un damné...

En fait, l'idée serait de récupérer le fichier dans un simpleXMLElement, le manipuler, et ensuite le passer au Zend_Config.

Dans la théorie c'est pas bien compliqué, mais en pratique c'est autre chose... Coder la logique récursive du truc n'est pas aussi facile que je le pensais...

Hors ligne

 

#6 03-02-2014 17:34:54

coremuch
Nouveau membre
Date d'inscription: 02-02-2014
Messages: 4

Re: Zend_Config_Xml - récupérer valeur depuis un tag avec attribut

j'ai aussi pensé a faire cela mais ca ne me paraissait pas si propre. c'est quand même fou que le framework ne permette pas de faire cela....

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages