2010-05-09 220 views
0

我想解析一个XML文件使用XmlReader,但虽然我由于某种原因从(XML)文件返回(委托)节点,我也得到一个空的SimpleXMLElement对象也返回。我不知道它是否与循环,开关或我在解析设置中遗漏的东西有关。SimpleXMLElement空对象

这是我尝试读取XML文件,你可以看到只有1返回的结果:

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

您打开循环两次打开和关闭标记。您需要检查节点类型一样,

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

星爷的脚本是从另一个来源,基本上指出的XMLReader对于大型饲料更好,它使用了SimpleXML的各个元素的量小。感谢它现在正确地工作。 – Michael 2010-05-10 07:41:36