【问题标题】:SimpleXMLElement to PHP Array [duplicate]SimpleXMLElement 到 PHP 数组 [重复]
【发布时间】:2010-04-28 02:35:01
【问题描述】:

变量$d来自file_get_contents函数到一个URL。

$answer = @new SimpleXMLElement($d);

下面是print_r($answer)的输出:

SimpleXMLElement Object
(
  [Amount] => 2698
  [Status] => OK
  [State] => FL
  [Country] => USA
)

如何检索每个元素的值并添加到数组中?我想不通。

【问题讨论】:

    标签: php xml arrays simplexml


    【解决方案1】:

    这应该可行:

    $xml = simplexml_load_string($xmlstring);
    $json = json_encode($xml);
    $array = json_decode($json,TRUE);
    

    【讨论】:

    • 我刚刚测试过,这行得通。甚至递归地执行它,这很棒。不过,我确实担心如果出现非 UTF-8 字符会发生什么。 json_encodejson_decode 方法在遇到非 UTF-8 字符时往往会窒息。包装在 try...catch 中是明智的,但我不知道是否有办法在不编写自定义解析器的情况下正确处理它(即编码为 UTF-8)。
    • json_encodehttp_build_query 似乎在解释 <![CDATA[ ]]> 标签时都有问题。似乎这两个函数都将它们确定为空对象,在这种情况下 http_build_query 完全忽略它。
    【解决方案2】:

    我对这个函数有疑问,因为当文本位于 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;
    }
    

    【讨论】:

    • 您似乎忘记在函数中重命名递归调用,因为函数是 SimpleXML2ArrayWithCDATASupport 但递归调用是 SimpleXML2Array。
    • @Loren 谢谢我编辑了它:)
    • 我发现json_encodehttp_build_query的症状一模一样,所以这个方法最靠谱。
    • 它仍然忽略 CDATA 字段。我不得不做$xml = simplexml_load_file('file.xml',SimpleXMLElement::class,LIBXML_NOCDATA);,但你的功能不再需要了,我可以做json_decode(json_encode((array) $xml),true);
    • 遗憾的是,仍然无法使用命名空间数据:/
    【解决方案3】:

    此函数将一个 xml simpleXML 递归解析为数组递归

    function SimpleXML2Array($xml){
        $array = (array)$xml;
    
        //recursive Parser
        foreach ($array as $key => $value){
            if(strpos(get_class($value),"SimpleXML")!==false){
                $array[$key] = SimpleXML2Array($value);
            }
        }
    
        return $array;
    }
    

    【讨论】:

    • 我对这个函数有疑问,因为当文本位于 CDATA 标记之间时,将每个 xml 子项类型转换为数组会给您带来问题。
    【解决方案4】:

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

    $array = array();
    foreach($answer as $k => $v) {
      $array[$k] = $v;
    }
    

    【讨论】:

    • 我无法通过以下方式遍历 SimpleXMLElement 对象
    【解决方案5】:

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

    $my_array = (array)$answer
    

    【讨论】:

    • 这既快速又简单。像魅力一样工作!谢谢!
    • 这不是递归的。
    猜你喜欢
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 2019-02-27
    • 2019-02-18
    • 2012-02-03
    • 2011-02-14
    • 2013-09-18
    相关资源
    最近更新 更多