我有一个52GB的xml文件,我需要插入数据库,但我不知道结构。我一直在寻找如何使用XMLReader迭代它,但似乎我必须知道这样做的结构。 如果我多次执行next(),它只会到达文件的末尾,如果我只执行一次,它会给我第一个节点,其中所有数据都是由于内存问题而无法看到任何内容。
$reader = new XMLReader();
$reader->open('D:\_WORK\ESStatistikListeModtag.xml');
$reader->read();
$reader->next();
var_dump($reader->expand());
这是我尝试的,我尝试了XMLReader的不同功能但没有成功。 我怎样才能做到这一点?感谢您提供任何帮助或建议。
答案 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 " ".$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);
}
}