[PHP/XML] DomDocument::getElementsByTagName

Résolu/Fermé
Daxter - 22 sept. 2008 à 15:19
Lease Messages postés 1 Date d'inscription lundi 26 janvier 2009 Statut Membre Dernière intervention 26 janvier 2009 - 26 janv. 2009 à 16:01
Bonjour,

J'ai besoin de recuperer du XML dans une page PHP puis d'en extraire un tag seulement. J'utilise donc DomDocument qui est tres performant, et la fonction DomDocument::getElementsByTagName.
Seulement voila si je charge mon XML dans mon objet DomDocument via une variable $string grace a la fonction DomDocument::loadXML cela ne marche pas alors que si je charge le meme XML mais via un fichier grace a la fonction DomDocument::load , ca marche parfaitement.

Voici le code qui marche :

 $Dom = new DomDocument();
 $Dom->validateOnParse = true;
 if($Dom->load("XML/test2.xml"))
    echo "XML charge.";
  $liste = $Dom->getElementsByTagName('field');

  foreach($liste as $lis)
    {
      if ($lis->hasAttribute("name")) {
	if($lis->getAttribute("name")=="Title")
	  echo $lis->nodeValue;
      }
    }


Et celui qui ne marche pas (et que je souhaite utiliser evidemment) :

 $Dom = new DomDocument();
 $Dom->validateOnParse = true;
 if($Dom->loadXML($xml))
     echo "XML charge.";
 $liste = $Dom->getElementsByTagName('field');

foreach($liste as $lis)
    {
      if ($lis->hasAttribute("name")) {
	if($lis->getAttribute("name")=="Title")
	  echo $lis->nodeValue;
      }
    }


Le fichier test2.xml et la variable $xml contiennent la meme chose. La seule difference se situe dans la maniere de charger le XML et je ne comprend donc pas pourquoi l'un ne marche pas.

Merci de votre aide.
A voir également:

6 réponses

Xil Messages postés 350 Date d'inscription vendredi 18 janvier 2008 Statut Membre Dernière intervention 11 juin 2009 257
22 sept. 2008 à 15:54
Bonjour,

Est-ce que PHP génère un message d'erreur dans le deuxième cas ?

Quid de la lecture/remplissage/encodage de la variable $xml ?
0
Non aucun message d'erreur.

Je travaille en faite avec un web service. Je lui adresse une requête SOAP en PHP, il me renvoie du XML que je récupéré dans la variable $xml.

Puis je souhaite récupérer la valeur du tag "field" qui a l'attribut "name" égale a "Title".

Pour l'encodage : <?xml version="1.0" encoding="ISO-8859-1"?>.
0
Xil Messages postés 350 Date d'inscription vendredi 18 janvier 2008 Statut Membre Dernière intervention 11 juin 2009 257
22 sept. 2008 à 16:03
Retire le check sur loadXML, et regarde s'il y'a un message d'erreur.
0
Non, ca change rien.

Bizarre cette affaire.
0
Xil Messages postés 350 Date d'inscription vendredi 18 janvier 2008 Statut Membre Dernière intervention 11 juin 2009 257
22 sept. 2008 à 16:12
Fais un débug de chaque step pour voir où ca coince.

var_dump($xml);
var_dump($liste);
0
Bonne idee.
var_dump($xml) vaut : string(14976) " mon xml " .
Mais dans les 2 cas var_dump($liste) affiche : object(DOMNodeList)#4 (0) { }

Connaissant mal cette fonction je ne sais pas si ça nous avance a quelque chose.
0
Xil Messages postés 350 Date d'inscription vendredi 18 janvier 2008 Statut Membre Dernière intervention 11 juin 2009 257
22 sept. 2008 à 16:42
Tu as bien des noeuds 'field' dans ton $xml ? Il est bien structuré ?
getElementsByTagName renvoit une liste vide s'il ne trouve rien
Si le dump est le même dans le premier cas, étonnant que tu aie un résultat.

Par acquis de conscience, ajoute ceci :
$Dom->loadXML($xml) or die('Can\'t load xml');


Tu as la main sur les fichiers de log PHP du serveur ? Pour vérifier s'il n'y a pas un message d'erreur.
loadXML ne génére pas d'erreur que quand il a réussi à charger le document xml, donc s'il n'y en a pas du tout, c'est que jusque là c'est bon.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Je viens de tester et le XML est bien charge. Je me demande si le fait que le XML soit dans une variable n'altère pas le XML.
Et voici mon XML :

<?xml version="1.0" encoding="ISO-8859-1"?> 
<wa-records version="1.0" timestamp="2008-09-22 12:45:35">
<record id="02902081" type="CR" database="prd">
<field sword="S82F7" name="BudgetCategory">X</field>
<field sword="S0D90" name="EscalationValue">1</field>
<field sword="S82F6" name="BudgetYear">XX</field>
<field sword="S809B" name="AssigneeName">XXXXXX</field>
<field sword="S809A" name="AssigneeGroup">XXXXX</field>
<field sword="S8612" name="AIRChange">N</field>
<field sword="S8213" name="FunctionalRank">9999</field>
<field sword="S8575" name="DateWhished9">16SEP08</field>
<field sword="S8A6A" name="Workflow">NORM</field>
<field sword="S84A6" name="RequestorDate">16SEP08</field>
<field sword="S0C62" name="LastModifyTime">13:43</field>
<field sword="S80A8" name="ImpactsPerformance">X</field>
<field sword="S0C61" name="EnteredTime">13:10</field>
<field sword="S80A3" name="ImpactsService">X</field>
<field sword="S80A2" name="FallbackRequest">N</field>
<field sword="S84DB" name="Origin">T</field>
<field sword="S8C5C" name="InitialWhishDate">16SEP08</field>
<field sword="S81FF" name="ComponentsType">OTH</field>
<field sword="S8A9F" name="ImpactOnDRSite">N</field>
<field sword="S8162" name="Title">XXXXXX: Test XX For XXX tool</field>
<field sword="S8161" name="Status">AS</field>
<field sword="S8160" name="Category">X</field>
<field sword="S88D1" name="OutputChange">N</field>
<field sword="S8A55" name="TemplateID">243</field>
<field sword="S8C92" name="SuppImpDCS">N</field>
<field sword="S0B2D" name="LoggerPhone">+XXXXXXXXXX</field>
<field sword="S8C91" name="SuppImpInv">N</field>
<field sword="S88CF" name="ImpactsLFS">N</field>
<field sword="S88CC" name="ProdTest">S</field>
<field sword="S8C4F" name="ChangeRetailManagement">N</field>
<field sword="S8995" name="VistaChange">N</field>
<field sword="S8C4E" name="ChangeRetailOLTA">N</field>
<field sword="S8994" name="EDIFACTChange">N</field>
<field sword="S0C09" name="Type">OTH</field>
<field sword="S8C4D" name="ChangeRetailAirline">N</field>
<field sword="S8993" name="DateApplicable9">Y</field>
<field sword="S8C4C" name="ChangeAlteaDesktop">N</field>
<field sword="S8310" name="ImpactsTAMS">N</field>
<field sword="S8992" name="DateApplicable8">Y</field>
<field sword="S8C4B" name="ChangeWebServices">N</field>
<field sword="S8991" name="DateApplicable7">Y</field>
<field sword="S8C4A" name="ChangeAPIProxy">N</field>
<field sword="S0C49" name="LoggingDate">16SEP08</field>
<field sword="S8990" name="DateApplicable6">Y</field>
<field sword="S88C8" name="NetImpDep">N</field>
<field sword="S830F" name="InputTransChange">N</field>
<field sword="S0C42" name="ReviewDate">31OCT08</field>
<field sword="S830E" name="ImpactsEUM">N</field>
<field sword="S898F" name="DateApplicable5">Y</field>
<field sword="S830D" name="ImpactsBCS">N</field>
<field sword="S8B26" name="CommunityAccess">C</field>
<field sword="S898E" name="DateApplicable4">Y</field>
<field sword="S830C" name="CommImpDep">N</field>
<field sword="S898D" name="DateApplicable3">Y</field>
<field sword="S830B" name="ImpactsDatabase">N</field>
<field sword="S898C" name="DateApplicable2">Y</field>
<field sword="S898B" name="DateApplicable1">Y</field>
<field sword="S0B5E" name="LastModifyUser">DT5030</field>
<field sword="S0BB1" name="ClassEntered">IWEXTAPI</field>
<field sword="S0B9B" name="LoggerGroup"> XXX </field>
<field sword="S8266" name="PriorityCategory">X</field>
<field sword="S8C7C" name="SuppImpPricing">N</field>
<field sword="S8AD2" name="UATApplicable">Y</field>
<field sword="S8C7B" name="SuppImpMarCom">N</field>
<field sword="S0B59" name="LoggerName"> XXX </field>
<field sword="S8C7A" name="SuppImpCustSup">N</field>
<field sword="S0C35" name="LastModifyDate">18SEP08</field>
<field sword="S0C34" name="EnteredDate">16SEP08 18SEP08 18SEP08 18SEP08</field>
<field sword="S80FB" name="RemoteDev">N</field>
<field sword="S0C72" name="LoggingTime">13:10</field>
-- il y en a encore ici mais je ne l'afficherai pas car je suis dans un cadre pro --
</record>
</wa-records>
0
Lease Messages postés 1 Date d'inscription lundi 26 janvier 2009 Statut Membre Dernière intervention 26 janvier 2009
26 janv. 2009 à 16:01
Hi Daxter,

I have the same trouble you had in September. It seems that we are using the same webservice for the same customer.

The problem is due to Soap envelop coming with the xml response. It cannot be printed so we don't see the difference but saving in an externel file you could see.

You didn't describe the solution you finally use to succeed. I'm interested.

PS : extension 2214 if needed

Thanks
0
Bon bah ca marche, j'ai change ma méthode pour récupérer le XML dans ma variable et c'est bon (car j'utilise un web services). Merci de ton aide en tout cas ;)
0
Xil Messages postés 350 Date d'inscription vendredi 18 janvier 2008 Statut Membre Dernière intervention 11 juin 2009 257
22 sept. 2008 à 17:30
C'est ce que j'allais proposer ;)

Après test, ca fonctionne en copiant la partie que tu as donné dans une variable et en passant par un fichier xml.
Ca ne pouvait donc venir que de la récupération.

N'oublie pas de changer le status du message en 'Résolu'.
0