使用 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;
}
我有一个简单的 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;
}