如何使用PHP解析具有多个xml声明的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 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。我已经有了解析代码。只是脚本不会解析下一个根节点。谢谢你的反馈