2010-05-09 8 views
0

J'essaye d'analyser un fichier XML en utilisant XmlReader mais bien que j'obtienne un retour du fichier xml pour le noeud (commission) pour une raison quelconque, je reçois un objet SimpleXMLElement vide retourné aussi. Je ne sais pas si c'est quelque chose à voir avec while loop, switch ou quelque chose que j'ai raté dans la configuration de l'analyse.Objet vide SimpleXMLElement

Ceci est le fichier xml que je suis en train de lire, comme vous pouvez le voir il y a seulement 1 résultat retourné:

<?xml version="1.0" encoding="UTF-8"?> 
<cj-api> 
    <commissions total-matched="1"> 
     <commission> 
      <action-status> 
       new 
      </action-status> 
      <action-type> 
       lead 
      </action-type> 
      <aid> 
       10730981 
      </aid> 
      <commission-id> 
       1021015513 
      </commission-id> 
      <country> 
      </country> 
      <event-date> 
       2010-05-08T08:08:55-0700 
      </event-date> 
      <locking-date> 
       2010-06-10 
      </locking-date> 
      <order-id> 
       345007 
      </order-id> 
      <original> 
       true 
      </original> 
      <original-action-id> 
       787692438 
      </original-action-id> 
      <posting-date> 
       2010-05-08T10:01:22-0700 
      </posting-date> 
      <website-id> 
       3201921 
      </website-id> 
      <cid> 
       2815954 
      </cid> 
      <advertiser-name> 
       SPS EurosportBET 
      </advertiser-name> 
      <commission-amount> 
       0 
      </commission-amount> 
      <order-discount> 
       0 
      </order-discount> 
      <sid> 
       0 
      </sid> 
      <sale-amount> 
       0 
      </sale-amount> 
     </commission> 
    </commissions> 
</cj-api> 

Ceci est mon analyseur:

<?php 

    // read $response (xml feed) 
    $file = "datafeed.xml"; 
    $xml = new XMLReader; 

    $xml->open($file); 

    // loop to read in data 

    while ($xml->read()) { 

      switch ($xml->name) { 

      // find the parent node for each commission payment 
       case 'commission': 
      // initalise xml parser 
        $dom = new DomDocument(); 
        $dom_node = $xml ->expand(); 
        $element = $dom->appendChild($dom_node); 
        $dom_string = $dom->saveXML($element); 
        $commission = new SimpleXMLElement($dom_string); 

        // read in data 

        $action_status = $commission->{'action-status'}; 
        $action_type = $commission->{'action-type'}; 
        $aid = $commission->{'aid'}; 
        $commission_id = $commission->{'commission-id'}; 
        $country = $commission->{'country'}; 
        $event_date = $commission->{'event-date'}; 
        $locking_date = $commission->{'locking-date'}; 
        $order_id = $commission->{'order-id'}; 
        $original = $commission->{'original'}; 
        $original_action_id = $commission->{'original_action-id'}; 
        $posting_date = $commission->{'posting-date'}; 
        $website_id = $commission->{'website-id'}; 
        $cid = $commission->{'cid'}; 
        $advertiser_name = $commission->{'advertiser-name'}; 
        $commission_amount = $commission->{'commission-amount'}; 
        $order_discount = $commission->{'order-discount'}; 
        $sid = $commission->{'sid'}; 
        $sale_amount = $commission->{'sale-amount'}; 


       print_r($aid); 
        break; 

      } 

    } 
    ?> 

Le résultat est:

SimpleXMLElement Object ([0] => 10730981) SimpleXMLElement Object () 

Pourquoi est-il ramener le deuxième objet: objet SimpleXMLElement() et que dois-je faire pour le corriger? Merci.

Répondre

1

Vous appuyez deux fois sur la boucle pour ouvrir et fermer des points. Vous devez vérifier le nodeType, comme,

if ($xml->name == 'commission' && $xml->nodeType == XMLReader::ELEMENT) { 
    // Process the node 
    } 

Je ne sais pas ce que vous essayez d'accomplir en utilisant un mélange de XMLReader, DOM et SimpleXML. Pourquoi ne pas vous venez d'utiliser SimpleXML, comme

$xml = simplexml_laod_file($file); 
    $commission = $xml->commissions[0]->commission[0]; 
    $aid = $commission->{'aid'}; 
    print_r($aid); 
+0

Yeh le script est d'une autre source, indiquant essentiellement que xmlreader est meilleur pour les flux de taille et qu'il utilise SimpleXML pour la petite quantité d'éléments individuels. Merci de l'avoir fait fonctionner correctement maintenant. – Michael