tags:

views:

96

answers:

1

Hi,

I am trying to parse an xml file using XmlReader but although I am getting a return from the xml file for the (commission) node for some reason I am getting an empty SimpleXMLElement Object returned as well. I don't know if its something to do with while loop,switch or something I missed in the parse setup.

This is the xml file I am trying to read from, as you can see there is only 1 result returned:

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

This is my parser:

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

            }

    }
    ?>

The result is :

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

Why is it returning the second object: SimpleXMLElement Object ( ) and what do I need to do correct it? Thanks.

A: 

You are hitting the loop twice for opening and closing tags. You need to check the nodeType, like,

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

I don't know what you are trying to accomplish by using a mixture of XMLReader, DOM and SimpleXML. Why don't you just use SimpleXML, like

   $xml = simplexml_laod_file($file);
   $commission = $xml->commissions[0]->commission[0];
   $aid = $commission->{'aid'};
   print_r($aid);
ZZ Coder
Yeh the script is from another source, basically stating that xmlreader is better for large feeds and that it uses simplexml for the small amount of individual elements. Thanks got it to work correctly now.
Mike