Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何解析大型XML文件_Php_Xml - Fatal编程技术网

Php 如何解析大型XML文件

Php 如何解析大型XML文件,php,xml,Php,Xml,我有下面的代码,它将根据某个子值从XML文件中检索数据 <?php $dom = new DOMDocument(); $dom->load('file.xml'); $xpath = new DOMXPath($dom); echo $xpath->evaluate('string(//Book[BookCode = "AD0WNR"] /Subject)'); ?> evaluate('string(//Book[BookCode=“AD0WNR”]/Subject

我有下面的代码,它将根据某个子值从XML文件中检索数据

<?php
$dom = new DOMDocument();
$dom->load('file.xml');
$xpath = new DOMXPath($dom);
echo $xpath->evaluate('string(//Book[BookCode = "AD0WNR"] /Subject)');
?>
evaluate('string(//Book[BookCode=“AD0WNR”]/Subject');
?>

如果我只有几行,代码就可以运行了。但是主xml文件超过了200mb,它无法检索任何内容。你能告诉我我做错了什么吗?小文件和大文件都具有相同的结构。

对于像这样的大型文档的解析,我建议使用流式解析器,这样您就可以解析XML,而无需立即将整个文件加载到内存中。通过使用它的方法,很容易将它与domapi一起使用

基于树的解析器(如DOM)速度非常快,但由于必须加载整个文档,因此会占用更多内存。像XMLReader这样的流式解析器可以减少内存使用,因为您一次只能获取文档的一部分,但取舍是处理时间更长

通过使用这两种方法,您可以调整如何串联使用每种方法,以便在最大限度地减少处理时间的同时达到内存限制等硬限制


例子:
它所做的是迭代XML中的节点。每当它碰到一个元素时,我们:

  • 将其导入DOM
  • 计算XPath表达式*
  • 如果XPath表达式找到了我们要查找的内容:

  • 打印结果
  • 关闭文件
  • 打破读循环
  • #2和#3我们这样做是因为我们只在寻找一个结果。如果你想找到更多的,就把它们拿走,继续用卡车运送



    (*我已将XPath表达式中的初始双正斜杠替换为
    self::
    以作用于作为第二个参数传递给
    evaluate()
    -谢谢,)

    您是否在PHP或web服务器日志中看到任何错误消息?(12)无法分配内存:无法创建子进程:/opt/suphp/sbin/suphp for/home/truckass/public\u html/bookingassist.ro/test/test.phpHow我可以用SAX解析文档吗?现在,如果我尝试查询6或7个值,加载需要5分钟,因此非常不方便您不需要附加扩展的节点。导入后使用evaluate的上下文参数<代码>$xpath->evaluate($string(self::Book[BookCode=“AD0WNR”]/Subject)$node)
    $dom    = new DOMDocument();
    $xpath  = new DOMXPath($dom);
    $reader = new XMLReader();
    $reader->open('file.xml');
    
    while ($reader->read()) {
        if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'Book') {
            $node = $dom->importNode($reader->expand(), true);
            $result = $xpath->evaluate(
                'string(self::Book[BookCode = "AD0WNR"]/Subject)',
                $node
            );
            if ($result) {
                echo $result;
                $reader->close();
                break;
            }
        }
    }