【问题标题】:How to parse SimpleXMLElement in php / Laravel 5?如何在 php / Laravel 5 中解析 SimpleXMLElement?
【发布时间】:2018-03-19 02:34:57
【问题描述】:

我使用 Guzzle 向后端的外部 API 发出 XML 请求。

这是我创建 Guzzle 客户端的地方:

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

这是我提出请求的地方:

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

这是我得到 Guzzle 响应并尝试解析它的地方:

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

如果我这样做:

dd($xml);

我收到这个作为回报:

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
}

我的问题是我不知道如何解析这个。我想在StatusCode 中获取1

如果我这样做:

dd($xml->StatusCode);

我收到这个:

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

我怎样才能得到1

【问题讨论】:

  • $xml->StatusCode 仍然是一个对象。您可以通过各种方式将其转换为字符串,例如简单地echo $xml->StatusCode
  • 谢谢,成功了。
  • 我提交了一个包含更多细节的答案。

标签: php laravel-5 xmlhttprequest simplexml guzzle


【解决方案1】:

var_dump() 输出是正确的。 $xml->StatusCode 是一个 SimpleXMLElement 实例。如果您必须向其中添加子元素,这当然是必需的:

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

如果$xml->StatusCode 仅包含元素的值而不是SimpleXMLElement 的实例,您将无法对加载的XML 进行任何修改。

所以,您需要做的是将StatusCode 的值转换为字符串。有多种方法可以做到这一点:

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

    【讨论】:

      猜你喜欢
      • 2015-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      相关资源
      最近更新 更多