【问题标题】:XML parsing is not working when it's only one array当只有一个数组时,XML 解析不起作用
【发布时间】:2021-04-23 13:56:11
【问题描述】:

我正在解析 xml,如下所示:

$result = '
<sms>
<status>0</status>
<message>
<contact_lists>
<contact_list><cl_id>11111</cl_id><phone>999999999</phone><name>Neu</name></contact_list>
<contact_list><cl_id>222222</cl_id><phone>888888888</phone><name>Alt</name></contact_list>
</contact_lists>
</message>
</sms>';

$xml = simplexml_load_string($result, "SimpleXMLElement", LIBXML_NOCDATA);
$json = json_encode($xml);
$array = json_decode($json,true);

$contact_lists = $array['contact_lists']['contact_list'];

A 有时数组看起来像这样,这是可行的。

Array ( [status] => 0 [message] => Array ( ) [contact_lists] => Array ( [contact_list] => Array ( [0] => Array ( [cl_id] => 11111 [phone] => 999999999 [name] => Neu ) [1] => Array ( [cl_id] => 222222 [phone] => 888888888 [name] => Alt ) ) ) )

B 但有时如果数组只有一个contact_list,它会如下所示

Array ( [status] => 0 [message] => Array ( ) [contact_lists] => Array ( [contact_list] => Array ( [cl_id] => 11111 [phone] => 999999999 [name] => Neu ) ) )

当我在 foreach 循环中使用 $contact_lists 时,它可以与 A 一起使用,因为有多个数组键,例如 0、1、2 等...但是使用 B 它会显示错误 Warning: Illegal string offset 'name' etc..,因为没有数组键,如 0,1,2 等...

所以解析 xml 会自动删除导致问题的键编号。

1-如果只有一个数组,有没有办法保留键编号?

2- 尝试使用 if (count($contact_lists) &gt;= 1) { ,但效果不佳..

有解决此类问题的解决方法的想法吗?

解决方案:

$contact_lists_found = isset($array['contact_lists']['contact_list']) ? $array['contact_lists']['contact_list'] : '';

    
    if ($contact_lists_found !== '' ) {

        if (array_key_exists('0', $contact_lists_found)) {
            // more than contact list
            $contact_lists = $array['contact_lists']['contact_list'];
        } else {
            // only one contact list
            $contact_lists[0] = $array['contact_lists']['contact_list'];
        }
        
    } else {
        
        $contact_lists = array();
    }

【问题讨论】:

  • 问题更可能是您不处理 XML,而是通过 json 传递数据来破坏数据。如果您学会了如何使用 SimpleXML 处理它,那么您可能可以更好地控制提取。

标签: php arrays xml xml-parsing


【解决方案1】:

您可以检查是否设置了键 0,如果没有设置,则只需将元素 contact_list 覆盖到一个数组中即可:

if(!isset($array['message']['contact_lists']['contact_list'][0])) {
  $array['message']['contact_lists']['contact_list'] = [
    $array['message']['contact_lists']['contact_list']
  ];
}

【讨论】:

  • 我用您的回答中的一些想法修复了它。我改为搜索数组。解决方案添加到帖子中。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 2012-08-06
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
  • 2018-03-10
相关资源
最近更新 更多