SimpleXml - am I missing something?

Associate
Joined
21 May 2003
Posts
1,365
Code:
$xml = '<Request type="getSeats" identification="{90381438-111f-4b6c-9c39-2d954a1e38cf}">
          <RequestItem requestid="1" sessionid="13218469" rankid="82009" zoneid="41009" amount="1"/>
          <RequestItem requestid="2" sessionid="13218469" rankid="82009" zoneid="41009" amount="1"/>
        </Request>';

$simpleXmlRequest = new SimpleXML($xml);
echo $lastRequestItemIndex = count($simpleXmlRequest->RequestItem); // prints 1

echo $simpleXmlRequest->RequestItem[$lastRequestItemIndex]['sessionid']; // prints nothing?!?

Any ideas? can't seem to get the RequestItem?
 
Code:
$xml = '<Request type="getSeats" identification="{90381438-111f-4b6c-9c39-2d954a1e38cf}">
          <RequestItem requestid="1" sessionid="13218469" rankid="82009" zoneid="41009" amount="1"/>
          <RequestItem requestid="2" sessionid="13218469" rankid="82009" zoneid="41009" amount="1"/>
        </Request>';

$simpleXmlRequest = new SimpleXMLElement($xml);
echo count($simpleXmlRequest->RequestItem); // prints 2

echo $simpleXmlRequest->RequestItem[$lastRequestItemIndex]['sessionid']; // don't know the rest of your code so this is pointless

fix'd
 
My bad, I made up that code to show an example of what I was doing, and the error you spotted in the example wasn't in the original code! I did forget that the array was 0-indexed though, so my code is now fixed with a -1 on the count() result.

Here's the actual code block just for reference:
Code:
// add the seating info to the request
foreach($seats as $key => $seat)
{
  $lastRequestItemIndex = count($this->simpleXmlRequest->RequestItem)-1;
  // if the seat matches the last added one, then just increment the amount and dont add another
  if(
      $this->simpleXmlRequest->RequestItem[$lastRequestItemIndex]
      && (string) $this->simpleXmlRequest->RequestItem[$lastRequestItemIndex]['sessionid'] == $seat->getSessionId() 
      && (string) $this->simpleXmlRequest->RequestItem[$lastRequestItemIndex]['rankid'] == $seat->getRankId()
      && (string) $this->simpleXmlRequest->RequestItem[$lastRequestItemIndex]['zoneid'] == $seat->getZoneId()
  )
  {
    $this->simpleXmlRequest->RequestItem[$lastRequestItemIndex]['amount'] += 1;
  }
  else
  {
    $newRequestItem = $this->simpleXmlRequest->addChild('RequestItem');
    $newRequestItem->addAttribute('requestid', $key+1);
    $newRequestItem->addAttribute('sessionid', $seat->getSessionId());
    $newRequestItem->addAttribute('rankid', $seat->getRankId());
    $newRequestItem->addAttribute('zoneid', $seat->getZoneId());
    $newRequestItem->addAttribute('amount', 1);
  }
}

The code basically forms an xml string that I send to a booking server to reserve seats. If more than 1 of the same type of ticket (identical zone/rank/session) is required then I can shorten the request string by using one request item and specifying an amount.

I didn't actually write the xml comms spec and I can't change it, but I know it's not great.
 
Last edited:
Back
Top Bottom