用php查找巨大的xml文件的结构

时间:2015-06-03 09:44:11

标签: php xml

我有一个52GB的xml文件,我需要插入数据库,但我不知道结构。我一直在寻找如何使用XMLReader迭代它,但似乎我必须知道这样做的结构。 如果我多次执行next(),它只会到达文件的末尾,如果我只执行一次,它会给我第一个节点,其中所有数据都是由于内存问题而无法看到任何内容。

    $reader = new XMLReader();
    $reader->open('D:\_WORK\ESStatistikListeModtag.xml');
    $reader->read();
    $reader->next();
    var_dump($reader->expand());

这是我尝试的,我尝试了XMLReader的不同功能但没有成功。 我怎样才能做到这一点?感谢您提供任何帮助或建议。

1 个答案:

答案 0 :(得分:0)

不能立即采取这两个部分

这个简单的代码可以帮助您理解结构。将路径数组设置为空并查看输出顶级,例如,。将它设置在数组路径中并观察下一级 - 和。如果您不喜欢公共交通工具:),请将'car'写入阵列并观看下一级......

$xml = new XMLReader(); 
$xml->open(FILENAME);
$path = array('root', 'car'...); 

$pp = array();
$selected = 0;           // requied fragment
$l = 0;                  // current level
$level = count($path);   // level to watch

while ($xml->read()) {
     if ($xml->nodeType == XMLReader::ELEMENT) {
        // Element start
        if ($l < $level) array_push($pp, $xml->name);
        if (($l == ($level-1) || !$level) && $path == $pp) { echo implode(', ', $pp)."<br>"; $selected = 1; }
        if (($l == $level) && ($selected )) echo "&nbsp;&nbsp;&nbsp;".$xml->name."<br>";
        $l++;
     }
    else if($xml->nodeType == XMLReader::END_ELEMENT) {
        // Element end
        if ($selected && ($l == $level)) {
            $selected = 0; 
            // you may write die here if you dont wait a repeats of "path"
        }
        $l--;
        if ($l < $level) array_pop($pp);       
    }
 }