无法使用SimpleXMLElement解析XML

时间:2012-06-23 02:24:09

标签: php soap simplexml

对于我的生活,我无法弄清楚为什么我不能访问这个肥皂包中的任何属性(甚至弄清楚它们是什么)。我无法使用水星返回给我的任何东西。我已经阅读了其他几个类似的问题而没有运气。我相信这只是我无知的产物,但任何帮助都会受到赞赏。

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

返回:

array(0) { }

但是这个:

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

返回:

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

是什么给出了?

更新

我从未想过使用PHP本机类,但使用CakePHPs XML类很容易。

2 个答案:

答案 0 :(得分:1)

  1. 您无法转储SimpleXMLElement
  2. SimpleXMLElement背后的想法是您应该能够分层访问每个节点。所以它基本上是RootNode-&gt; FirstChildNode-&gt; FirstChildNodeOfTheFirstChildNode-&gt; AndSoOn
  3. 默认情况下,如果使用字符串或变量连接SimpleXMLElement,则调用__toString()方法。

答案 1 :(得分:1)

问题是,在内部,SimpleXMLElement不会存储为一个简单的对象。基本上,您必须知道要访问哪些属性,并且它从内部结构中动态组合结果。在您的情况下,您可以使用以下内容:http://php.net/manual/en/simplexmlelement.xpath.php(请参阅示例)以有效地提取数据。此外,为了严格回答您的问题,您可以使用以下内容:http://www.php.net/manual/en/simplexmlelement.attributes.php