2010-05-09 8 views
0

Я пытаюсь проанализировать XML-файл с помощью XmlReader, но, хотя я получаю возврат из XML-файла для узла (комиссии) по какой-то причине, я получаю пустой объект SimpleXMLElement. Я не знаю, с чем это связано с циклом, переключением или тем, что я пропустил в настройке синтаксического анализа.SimpleXMLElement пустой объект

Это файл XML Я пытаюсь читать, как вы можете видеть, что есть только один результат, возвращаемый:

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

Это мой парсер:

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

      } 

    } 
    ?> 

Результат:

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

Почему это возвращение второго объекта: SimpleXMLElement Object() и что мне нужно для исправления? Благодарю.

ответ

1

Вы дважды нажимаете на цикл для открывания и закрывания тегов. Вы должны проверить NODETYPE, как,

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

Я не знаю, что вы пытаетесь достичь, используя смесь XMLReader, DOM и SimpleXML. Почему бы вам не просто использовать SimpleXML, как

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

Yeh скрипт из другого источника, в основном о том, что XmlReader лучше для крупных каналов и что он использует SimpleXML для небольшого количества отдельных элементов. Спасибо, что он работает правильно. – Michael