【问题标题】:Converting XML file with one node using simplexml_load_string()使用 simplexml_load_string() 转换一个节点的 XML 文件
【发布时间】:2022-01-14 08:55:12
【问题描述】:

我有一个简单的 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
                )
        )
)

使用 [0] 键,例如用于具有更多节点的 xml 文件,而不是:

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

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

【问题讨论】:

    标签: php xml simplexml


    【解决方案1】:

    SimpleXML 已经做了你想做的事——两者的区别只在于print_r 的输出,它显示了访问元素的最简洁 方式,而不是唯一 方式。

    具体来说,$xml-&gt;node-&gt;value$xml-&gt;node[0]-&gt;value[0] 始终可以用于引用同一个节点,而foreach ( $xml-&gt;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 文件中的这些数据进行比较/整理。一方面使用数组,另一方面使用对象,或者更好地将其转换为相同的类型,是最佳选择吗?
    • 我想到了数组,因为函数 array_intersect_key()、array_change_key_case() 等对我非常有用。
    • 使用数组很好,但不要期望编写一个可以将任何 XML 文档转换为有用数组的函数,因为可以构造 XML 的方式很多,而且您可能不知道的细节很多不在乎。相反,请查看您拥有的特定文档,并遍历您感兴趣的部分,将它们构建到您自己的数组结构中。例如,在本例中,您可能会遍历节点并创建类似 ['Val1', 'Val2][ ['Value' =&gt; 'Val1'], ['Value' =&gt; 'Val2'] ] 的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 2011-11-29
    • 2013-02-17
    • 1970-01-01
    相关资源
    最近更新 更多