drewwyatt
drewwyatt

Reputation: 6027

Trouble parsing XML with SimpleXMLElement

For the life of me I can't figure out why I can't access any of the properties (or even figure out what they are) in this soap packet. I can't use anything that Mercury is returning to me. I have read through several other similar questions with no luck. I am sure this is just a product of my ignorance, but any help would be way appreciated.

$transactionInfo = new MercuryPaymentHandler($paymentID);
$returnValue = $transactionInfo->verifyPayment();
$xml = new SimpleXMLElement($returnValue);
var_dump(get_object_vars($xml));

returns:

array(0) { }

But this:

$transactionInfo = new MercuryPaymentHandler($paymentID);
$returnValue = $transactionInfo->verifyPayment();
$xml = new SimpleXMLElement($returnValue);
echo $xml->asXML();

returns:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
    <VerifyPaymentResponse xmlns="http://www.mercurypay.com/">
        <VerifyPaymentResult>
            <ResponseCode>0</ResponseCode>
            <Status>Approved</Status>
            <StatusMessage>AP</StatusMessage>
            <DisplayMessage>Your transaction has been approved.</DisplayMessage>               
            <AvsResult/>
            <CvvResult>M</CvvResult>
            <AuthCode>000027</AuthCode>
            <Token>ItIu8ayb9ZyMcBjHUkyHS0krnFVf6esnfs6tULuAo2giERIQACMQAgyc</Token>
            <RefNo>0028</RefNo>
            <Invoice>48</Invoice>
            <AcqRefData>KbMCC2110080622 </AcqRefData>
            <CardType>M/C</CardType><MaskedAccount>xxxxxxxx6781</MaskedAccount>
            <Amount>7</Amount>
            <TaxAmount>0</TaxAmount>
            <TransPostTime>2012-06-22T21:10:08.65</TransPostTime>
            <CardholderName>Test-User</CardholderName>
            <AVSAddress/>
            <AVSZip/>
            <TranType>Sale</TranType>
            <PaymentIDExpired>true</PaymentIDExpired>
            <CustomerCode/>
            <Memo>Mighty Wash 2.0</Memo>
            <AuthAmount>7</AuthAmount>
            <VoiceAuthCode/>
            <ProcessData>|00|600550672000</ProcessData>
            <OperatorID/>
            <TerminalName/>
        </VerifyPaymentResult>
        </VerifyPaymentResponse>
    </soap:Body>
</soap:Envelope>

What gives?

Update

I never figured this out using PHPs native class, but it was way easy with CakePHPs XML class.

Upvotes: 0

Views: 142

Answers (2)

user1440875
user1440875

Reputation:

  1. You can't dump SimpleXMLElement
  2. The idea behind SimpleXMLElement is that you should be able to access each node hierarchically. So it's basically RootNode->FirstChildNode->FirstChildNodeOfTheFirstChildNode->AndSoOn
  3. By default if you concatenate SimpleXMLElement with a string or variable __toString() method is invoked.

Upvotes: 1

Mihai Todor
Mihai Todor

Reputation: 8264

The problem is that, internally, SimpleXMLElement is not stored as a trivial object. Basically, you have to know what properties to access and it composes the result on the fly from its internal structures. In your case, you could use something like this: http://php.net/manual/en/simplexmlelement.xpath.php (see the examples) to extract data efficiently. Also, to strictly answer your question, here is what you could use: http://www.php.net/manual/en/simplexmlelement.attributes.php

Upvotes: 1

Related Questions