How to parse SimpleXMLElement in php / Laravel 5?

梦想与她 提交于 2019-12-11 01:44:21

问题


I use Guzzle to make an XML request to an external API in the back-end.

This is where I create the Guzzle client:

$client = new Client(); //GuzzleHttp\Client

This is where I make the request:

$request = $client->request( 'GET', 'This is where I put the URL');

This is where I get the Guzzle response and try to parse it:

$xml = $request->getBody()->getContents();
$xml = new \SimpleXMLElement($xml);
$xml = simplexml_load_string($xml);

If I do this:

dd($xml);

I receive this in return:

SimpleXMLElement {#240 ▼
  +"StatusCode": "1"
  +"StatusDescription": "Duplicated request"
  +"MerchantId": "***"
  +"Company": "***"
  +"CompanyCity": "***"
  +"CompanyPhone": "***"
  +"CompanyDbaName": "***"
  +"Balance": "99965"
  +"TransDate": "2017-10-07"
  +"TransTime": "06:58:48"
  +"ProductVer": "***"
  +"PromoVer": object
  +"SoftVer": object
  +"InvoiceNumber": object
}

My problem is that I don't know how to parse this. I want to get the 1 in StatusCode.

If I do this:

dd($xml->StatusCode);

I receive this:

SimpleXMLElement {#242 ▼
  +0: "1"
}

How do I get just 1 ?


回答1:


The var_dump() output is correct. $xml->StatusCode is a SimpleXMLElement instance. This is of course needed in case you have to, for example, add a child element to it:

$xml->StatusCode->addChild("test", "value");

If $xml->StatusCode contained only the value of the element rather than an instance of SimpleXMLElement, you wouldn't be able to do any modifications on the loaded XML.

So, what you need to do, is cast the value of StatusCode to a string. There are various ways of doing this:

var_dump($xml->StatusCode); // returns SimpleXMLElement instance
var_dump((string)$xml->StatusCode); // explicitly
var_dump($xml->StatusCode->__toString()); // explicitly, calling the magic function
echo $xml->StatusCode; // implicitly

Some demos




回答2:


 /**
 * @param $xmlObject
 * @param array $out
 * @return array
 */
private function simpleXmlToArray($xmlObject, $out = array ())
{
    foreach ($xmlObject as $index => $node ){
        if(count($node) === 0){
            $out[$node->getName()] = $node->__toString ();
        }else{
            $out[$node->getName()][] = $this->simpleXmlToArray($node);
        }
    }

    return $out;
}


来源:https://stackoverflow.com/questions/46620096/how-to-parse-simplexmlelement-in-php-laravel-5

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!