使用 simplexml_load_string() 转换具有一个节点的 XML 文件

Converting XML file with one node using simplexml_load_string()

我有一个简单的 xml 文件,有一个或多个节点,例如:

<?xml version='1.0' standalone='yes'?>
<nodes>
 <node>
  <value>Val1</value>
 </node> 
</nodes>

是否有可能,使用simplexml_load_string()函数,对于具有一个节点的文件(如上所述)得到:

SimpleXMLElement Object
(
    [node] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [value] => Val1
                )
        )
)

with [0] 键,比如 xml 文件有更多的节点,而不是:

SimpleXMLElement Object
(
    [node] => SimpleXMLElement Object
        (
            [value] => Val1
        )
)

因为接下来我需要将其转换为具有相同深度的数组,无论是来自具有一个还是多个节点的文件

SimpleXML 已经做了你想要的 - 两者之间的区别仅在于 print_r 的输出,它显示了最 concise访问元素的方式,而不是 only 方式。

具体来说,$xml->node->value$xml->node[0]->value[0]总是可以用来引用同一个节点,而foreach ( $xml->node as $node )即使只有一个匹配节点也总是有效。

这就是为什么“盲目”将 XML 结构转换为 PHP 数组通常不是一个好主意 - 相反,使用 foreach 循环和 属性有权提取您需要的任何信息。

您可以使用以下代码自行尝试:

// Single node
$xml1 = <<<XML
<?xml version='1.0' standalone='yes'?>
<nodes>
 <node>
  <value>Val1</value>
 </node> 
</nodes>
XML;

$sx1 = simplexml_load_string($xml1);
print_r($sx1); // misleading!
echo $sx1->node->value, PHP_EOL;
echo $sx1->node->value[0], PHP_EOL;
echo $sx1->node[0]->value[0], PHP_EOL;
echo $sx1->node[0]->value, PHP_EOL;
foreach ( $sx1->node as $node ) {
   echo $node->value, PHP_EOL;
}

// Two nodes with same name
$xml2 = <<<XML
<?xml version='1.0' standalone='yes'?>
<nodes>
 <node>
  <value>Val1</value>
 </node> 
 <node>
  <value>Val2</value>
 </node> 
</nodes>
XML;

$sx2 = simplexml_load_string($xml2);
print_r($sx2); // misleading!
echo $sx2->node->value, PHP_EOL;
echo $sx2->node[0]->value, PHP_EOL;
echo $sx2->node[0]->value[0], PHP_EOL;
echo $sx2->node->value[0], PHP_EOL;
foreach ( $sx2->node as $node ) {
   echo $node->value, PHP_EOL;
}