Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.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声明的xml文件?(几个XML文件的串联)_Php_Xml - Fatal编程技术网

如何使用PHP解析具有多个xml声明的xml文件?(几个XML文件的串联)

如何使用PHP解析具有多个xml声明的xml文件?(几个XML文件的串联),php,xml,Php,Xml,xml的格式: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE > <root> <node> <element1></element1> <element2></element2> <element3></element2> <element4></element3> </n

xml的格式:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE >
<root>
 <node>
  <element1></element1>
  <element2></element2>
  <element3></element2>
  <element4></element3>  
</node>
</root>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE >
<root>
 <node>
  <element1></element1>
  <element2></element2>
  <element3></element2>
  <element4></element3>  
</node>
</root>

之后还有几个xml声明。 顺便说一句,文件大小为500MB。 我想寻求帮助,如何解析这个文件而不使用PHP将其分解成不同的文件

任何帮助都将不胜感激。
谢谢。

如果不想分割文件,则必须在内存中使用它。考虑到您的500MB文件大小,这可能会产生问题。无论如何,一种选择是从所有文档中删除XML Prolog和DocType,然后像这样加载整个文档:

$dom = new DOMDocument;
$dom->loadXML(
    sprintf(
        '<?xml version="1.0" encoding="UTF-8"?>%s' .
        '<!DOCTYPE >%s' . 
        '<roots>%s</roots>',
        PHP_EOL, 
        PHP_EOL, 
        str_replace(
            array(
                '<?xml version="1.0" encoding="UTF-8"?>', 
                '<!DOCTYPE >'
            ),
            '',
            file_get_contents('/path/to/your/file.xml')
        )
    )
);
$dom=新的DOMDocument;
$dom->loadXML(
斯普林特(
“%s”。
“%s”。
“%s”,
PHP_EOL,
PHP_EOL,
stru_替换(
排列(
'', 
''
),
'',
文件获取内容('/path/to/your/file.xml')
)
)
);

这将使它成为一个巨大的XML文件,只有一个XML prolog和一个DocType(注意,我假设DocType对于文件中的所有文档都是相同的)。然后,您可以通过迭代各个根元素来处理该文件。

我正在使用XML reader,因为我正在解析一个大的XML文件。您能帮助我使用与XML阅读器相同的代码吗。因为我是通过流或字节读取xml的。谢谢,谢谢你的主意。我只是删除了xml标记和doctype,然后在文件中添加了一个主根。我现在可以工作了。这对我来说是一个100MB的文件,代码运行大约5秒钟。请注意,您必须使用类似以下内容为PHP分配更多内存:ini_set('memory_limit','768M');您的文档被视为无效。您可以使用str_replace删除额外的声明,然后从有效的XML文档中进行操作。这里的读者通常希望在提问之前看到一些先前的研究,正如您所知。但是fwiw,您可能希望使用“流读取器”,比如XMLReader,而不是将文档完全加载到内存中的读取器,比如SimpleXML。我已经有了解析代码。只是脚本不会解析下一个根节点。谢谢你的反馈