Rechercher : dans
Par :

[PHP/XML] DomDocument::getElementsByTagName

Dernière réponse le 26 jan 2009 à 16:01:51 Daxter, le 22 sep 2008 à 15:19:37 
 Signaler ce message aux modérateurs

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.
Configuration: Linux Suse
Firefox 3.0.1

Meilleures réponses pour « [PHP/XML] DomDocument::getElementsByTagName » dans :
PHP - Parser du XML VoirIntroduction à XML PHP permet l'analyse syntaxique (parsage ou parsing en anglais) d'un document XML. Le langage XML (eXtensible Markup Language, traduisez Langage à balises extensibles) est un métalangage, c'est-à-dire un langage permettant de...
PHP - Les fichiers VoirLa gestion des fichiers avec PHP Avec PHP, la création ou la lecture de fichiers est, une fois de plus, assez simple. Il existe une multitude de fonctions dédiées à l'utilisation des fichiers. La communication entre le script PHP et le fichier...
DOM (Document Object Model) et SAX (Simple API for XML) VoirXML permet de définir la structure du document uniquement, ce qui permet d'une part de pouvoir définir séparément la présentation de ce document, d'autre part d'être capable de récupérer les données présentes dans le document pour les...

1

Xil, le 22 sep 2008 à 15:54:06

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 ?

Répondre à Xil

2

Daxter, le 22 sep 2008 à 15:59:23

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"?>.

Répondre à Daxter

3

Xil, le 22 sep 2008 à 16:03:03

Retire le check sur loadXML, et regarde s'il y'a un message d'erreur.

Répondre à Xil

4

Daxter, le 22 sep 2008 à 16:09:00

Non, ca change rien.

Bizarre cette affaire.

Répondre à Daxter

5

Xil, le 22 sep 2008 à 16:12:22

Fais un débug de chaque step pour voir où ca coince.

var_dump($xml);
var_dump($liste);

Répondre à Xil

6

Daxter, le 22 sep 2008 à 16:26:18

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.

Répondre à Daxter

7

Xil, le 22 sep 2008 à 16:42:09

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.

Répondre à Xil

8

Daxter, le 22 sep 2008 à 16:52:35

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>

Répondre à Daxter

11

 Lease, le 26 jan 2009 à 16:01:51

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

Répondre à Lease

9

Daxter, le 22 sep 2008 à 16:54:29

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 ;)

Répondre à Daxter

10

Xil, le 22 sep 2008 à 17:30:08

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'.

Répondre à Xil