【问题标题】:converting xml into array, unable to handle node inside a node将xml转换为数组,无法处理节点内的节点
【发布时间】:2011-06-21 20:26:28
【问题描述】:

我想将 xml 脚本转换为 PHP 中的关联数组。 XML 脚本是:

<ages>
    <Peter>
        <Peterchild>4</Peterchild>
        <Peterchild>6</Peterchild>
    </Peter>
    <Quagmire>30</Quagmire>
    <Joe>34</Joe>
</ages>

我编写的将其转换为数组的代码是

${$xml->getName()} = array();
foreach($xml->children() as $child){
    $ages[$child->getName()] = (string)$child;
}

输出为

Array
(
    [Peter] => 



    [Quagmire] => 30
    [Joe] => 34
)

问题是我无法找出递归遍历 children 的孩子(本例中为 Peter 的孩子)的条件。如何更改此代码以同时考虑这些节点?

【问题讨论】:

  • 你说了神奇的词,递归......递归。在当前使用方法 children() 的情况下,您需要应用递归函数来向下钻取并获取所需的值。或者您应该调查是否有另一种方法可以将整个 xml 转换为一个数组或数组数组(如果需要)。
  • 查看此页面上的 2 个示例:php.net/manual/en/class.simplexmliterator.php,两者都可以满足您的需求。
  • @Zyava 谢谢,它有帮助

标签: php xml arrays simplexml associative-array


【解决方案1】:

您需要创建一个解析一个级别的函数,然后当它在当前级别内找到一个节点时让该函数自行调用。它非常复杂,可能会变得混乱。出于好奇,当您可以使用 SimpleXML 对象以对象格式访问所需的所有信息时,为什么要这样做?

【讨论】:

    【解决方案2】:
    ${$xml->getName()} = array();
        foreach($xml->children() as $child) 
        {
          if (count($child->children() > 0) 
          {
             foreach ($child->children as $childnode)
             {
               $ages[$childnode->getName()] = (string)$childnode;
             }
          }
          else {
              $ages[$child->getName()] = (string)$child;
          }
       }
    

    这只有在 1 级深时才有效,如果要更深,你应该编写一个函数,它将逐级循环。

    【讨论】:

      猜你喜欢
      • 2014-02-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-16
      相关资源
      最近更新 更多