优雅地处理simplexml到数组

时间:2016-04-16 18:25:30

标签: php simplexml

我有一个xml结构:

<node1><node2><child_1/><child_2/><child_3/></node2></node1>

我想得到一个这样的数组:

['child_1', 'child_2', 'child_3']

但是要使我的方法优雅地创建这个句柄错误并在没有找到任何内容时返回一个空数组我必须这样做:

public function testXmlParse()
{
    $config = new SimpleXMLElement("<node1><node2><child_1/><child_2/><child_3/></node2></node1>");
    $result = $config->xpath('/node1/node2');

    if (! count($result)) {
        return [];
    }

    $result = $result[0]->children();
}

但是我有更多的代码要写,以检查数组和有效等。

是否有一种优雅的方式来获得正确的结果并且在没有找到任何结果时返回0?

1 个答案:

答案 0 :(得分:0)

您编写的代码无论如何都不会返回数组 - ->children()的结果是一个可迭代的SimpleXMLElement对象。但是,您可以利用零元素对象仍然可以使用foreach进行迭代这一事实,并且只会绕零次。

由于您总是在寻找第一个匹配项,因此您的示例也可以使用SimpleXML访问而不是XPath,以避免出现额外的逻辑。

$config = new SimpleXMLElement("<node1><node2><child_1/><child_2/><child_3/></node2></node1>");
// Start with an empty array; if no children are found, it will stay empty
$results = [];
// Note: $config represents the <node1> element, not the document
foreach ( $config->node2->children() as $name => $element ) {
    $results[] = $name;
}

如果<node2>并不总是存在,您可能需要在循环周围添加额外的if ( isset($config->node2) ),以避免PHP向您发出警告。