【问题标题】:Parsing XML Document into Multidimensional Array将 XML 文档解析为多维数组
【发布时间】:2011-08-17 16:21:18
【问题描述】:

我正在尝试从 XML 文件创建一个无限深度的多维数组。原因我就不说了,直奔主题吧。

我希望下面的代码解析 XML 字符串,将所有 <item><nest> 标记插入到数组中。任何在<nest> 标记下直接找到的<item> 标记都应插入到包含在主数组中的数组中。

在递归调用中,我已将密钥作为第二个参数传递给一个新数组,因此我希望它开始向这个新数组添加项目。然而,事实并非如此。如果有人可以帮助我解决问题,我将不胜感激。

代码应该使用简单的 C+P 运行。谢谢。

class Parser
{
  static function subMenuRecursionArray($xml, $array = '', $itemcount = 1, $nestcount = 1)
  {
    foreach($xml->children() as $k => $v)
    {
        if ((string) $k == 'item')
        {
            $array["item$itemcount"]['text'] = (string) $v;
            $array["item$itemcount"]['command'] = (string) $v['command'];
            $itemcount++;
        }

        if ((string) $k == 'nest')
        {
            $array["nest$nestcount"] = array('name' => (string) $v['name'], 'items' => array());
            $nestcount++;

            self::subMenuRecursionArray($xml->nest, $array["nest".($nestcount-1)]['items'], $itemcount, $nestcount);
        }
    }
    return $array;
  }
}

$xml_fragment = '
<menu>
<item command="DefaultCommand">Main (Not nested 1)</item>
<item command="DefaultCommand">Main 2 (Not nested 2)</item>
<nest name="Cont">
    <item command="Contact">NESTED Contact 1</item>
    <item command="Contact">NESTED Contact 2</item>
  </nest>
</menu>';

$xml = simplexml_load_string($xml_fragment);
$array = Parser::subMenuRecursionArray($xml);
echo '<pre>' . print_r($array, 1) . '</pre>';

【问题讨论】:

  • 我不明白为什么有人会需要它。 DOMDocument-Object 会比数组舒服得多。
  • 通过“&lt;item&gt; 嵌套在 &lt;nest&gt; 中的标签”,您的意思是嵌套元素的所有直接项子项或任何后代,例如嵌套元素下方层次结构中的任何项目?
  • 难以捉摸:我会告诉你背后的原因!如果您可以将此视为假设,那就太好了。谢谢。
  • 我使用名为 xmlize 的库来执行此操作。如果您进行搜索,我认为它最初是 xmlize.inc 或 xmlize.php。
  • Gordon:我的意思是直接项子项。还可以添加更多嵌套标签,甚至需要更高级别的递归。感谢您指出这一点,我将改写主题。

标签: php xml arrays recursion xml-parsing


【解决方案1】:

将您的代码更改为此 - 请注意您的调用 subMenuRecursionArray 正在返回一个数组,但您没有将它分配给任何东西 - 所以它只是丢失了。

<?php
class Parser
{
  static function subMenuRecursionArray($xml, $array = '', $itemcount = 1, $nestcount = 1)
  {
    foreach($xml->children() as $k => $v)
    {
        if ((string) $k == 'item')
        {
            $array["item$itemcount"]['text'] = (string) $v;
            $array["item$itemcount"]['command'] = (string) $v['command'];
            $itemcount++;
        }

        if ((string) $k == 'nest')
        {
            $array["nest$nestcount"] = array('name' => (string) $v['name'], 'items' => array());
            $nestcount++;

            $array["nest$nestcount"]['items'] = self::subMenuRecursionArray($xml->nest, $array["nest".($nestcount-1)]['items'], $itemcount, $nestcount);
        }
    }
    return $array;
  }
}

$xml_fragment = '
<menu>
<item command="DefaultCommand">Main (Not nested 1)</item>
<item command="DefaultCommand">Main 2 (Not nested 2)</item>
<nest name="Cont">
    <item command="Contact">NESTED Contact 1</item>
    <item command="Contact">NESTED Contact 2</item>
  </nest>
</menu>';

$xml = simplexml_load_string($xml_fragment);
$array = Parser::subMenuRecursionArray($xml);
echo '<pre>' . print_r($array, 1) . '</pre>';
?>

【讨论】:

    猜你喜欢
    • 2011-01-28
    • 2019-06-13
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多