【发布时间】:2021-06-16 07:58:21
【问题描述】:
我习惯于使用DOMDocument 和DOMXPath 来解析/遍历我的XML。
现在我有 2.5 MB 的 XML 文件,并且刚刚意识到 DOMDocument 在“处理”该文件时非常慢。
我用谷歌搜索了一些关于 XMLReader 的内容,他们说这是更好的方法,并且可能具有处理大型 XML 文件的最快性能
问题是我不知道如何将DOMXPath 与XMLReader 合并
如何将以下代码转换为XMLReader?
$dom = new DOMDocument;
$dom->load('myxml.xml');
$xp = new DOMXPath($dom);
$xp->registerNamespace('f', 'my-name-space:namespace');
$expression = "//f:my-person/@name";
$col = $xp->query($expression);
我已经这样做了,但还是很慢:
注意:这是取自该线程的假设代码:XML DOMDocument optimization。不过重点是一样的
$xmlReader = new XMLReader();
$xmlReader->open('myxml.xml');
while ($reader->read()) {
switch ($reader->nodeType) {
case (XMLREADER::ELEMENT):
if ($reader->localName == "game") {
$node = $reader->expand();
$dom = new DomDocument();
$n = $dom->importNode($node,true);
$dom->appendChild($n);
$xp = new DOMXPath($dom);
$xp->registerNamespace('f', 'my-name-space:namespace');
$expression = "//f:my-person/@name";
$col = $xp->query($expression);
}
}
}
随意建议任何 PHP 库来解决这个问题
【问题讨论】:
-
如果您查找
my-person元素而不是game元素,它可能会更快(无法给出任何数字)。然后,您只需要获取属性,而不必加载 XML 并使用 XPath。