SimpleXMLElement到PHP数组

Cod*_*x73 21 php xml arrays simplexml

变量$d来自file_get_contentsURL的功能.

$answer = @new SimpleXMLElement($d);
Run Code Online (Sandbox Code Playgroud)

以下是输出print_r($answer):

SimpleXMLElement Object
(
  [Amount] => 2698
  [Status] => OK
  [State] => FL
  [Country] => USA
)
Run Code Online (Sandbox Code Playgroud)

如何检索每个元素的值并添加到数组?我无法弄清楚.

dki*_*zer 51

在这种简单的情况下,类型转换也可以工作:

$my_array = (array)$answer
Run Code Online (Sandbox Code Playgroud)

  • 这不是递归的。 (2认同)

小智 38

这应该工作:

$xml = simplexml_load_string($xmlstring);
$json = json_encode($xml);
$array = json_decode($json,TRUE);
Run Code Online (Sandbox Code Playgroud)

  • `json_encode` 和 `http_build_query` 似乎在解释 `<![CDATA[` `]]>` 标签时都有问题。似乎两个函数都将它们确定为空对象,在这种情况下,`http_build_query` 会完全忽略它。 (3认同)

ZZ *_*der 10

$answer已经可以作为一个数组工作.如果你想把它放在一个真正的数组中,你可以这样做,

$array = array();
foreach($answer as $k => $v) {
  $array[$k] = $v;
}
Run Code Online (Sandbox Code Playgroud)


Bo *_*ngs 6

我对此功能有疑问,因为当文本在CDATA标签之间时,将每个XML子类型都转换为数组可能会出现问题。

我通过检查对数组的类型转换的结果是否为空来解决此问题。如果是这样,则将其强制转换为字符串,您将获得正确的结果。

这是我的修改后的CDATA支持版本:

function SimpleXML2ArrayWithCDATASupport($xml)
{   
    $array = (array)$xml;

    if (count($array) === 0) {
        return (string)$xml;
    }

    foreach ($array as $key => $value) {
        if (!is_object($value) || strpos(get_class($value), 'SimpleXML') === false) {
            continue;
        }
        $array[$key] = SimpleXML2ArrayWithCDATASupport($value);
    }

    return $array;
}
Run Code Online (Sandbox Code Playgroud)