[PHP/XML] DomDocument::getElementsByTagName

Résolu
Daxter -  
Lease Messages postés 1 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Membre Dernière intervention   257
 
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
Daxter
 
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   Statut Membre Dernière intervention   257
 
Retire le check sur loadXML, et regarde s'il y'a un message d'erreur.
0
Daxter
 
Non, ca change rien.

Bizarre cette affaire.
0
Xil Messages postés 350 Date d'inscription   Statut Membre Dernière intervention   257
 
Fais un débug de chaque step pour voir où ca coince.

var_dump($xml);
var_dump($liste);
0
Daxter
 
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   Statut Membre Dernière intervention   257
 
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
Daxter
 
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   Statut Membre Dernière intervention  
 
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
Daxter
 
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   Statut Membre Dernière intervention   257
 
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