嗨,我有一个xml文件,里面大约有12000条记录。我已经编写了代码,它运行良好,只需要一段时间来解析xml文件并返回内容。有没有办法加快这个过程?
我的代码:
<?php
$dom = new DOMDocument();
$dom->load('comics.xml');
foreach ($dom->getElementsByTagName('record') as $entry)
{
$title = $entry->getElementsByTagName('title')->item(0)->textContent;
echo $title;
}
?>
XML文件(只有一个演示在那里不能链接他们所有的lol):
<?xml version='1.0' encoding='utf-8'?>
<calibredb>
<record>
<id>1</id>
<uuid>991639a0-7cf6-4a34-a863-4aab8ac2921d</uuid>
<publisher>Marvel Comics</publisher>
<size>6109716</size>
<title sort="Iron Man v1 101">Iron Man v1 101</title>
<authors sort="Unknown">
<author>Unknown</author>
</authors>
<timestamp>2012-04-15T18:49:22-07:00</timestamp>
<pubdate>2012-04-15T18:49:22-07:00</pubdate>
<cover>M:/Comics/Unknown/Iron Man v1 101 (1)/cover.jpg</cover>
<formats>
<format>M:/Comics/Unknown/Iron Man v1 101 (1)/Iron Man v1 101 - Unknown.zip</format>
</formats>
</record>
</calibredb>
DOM方法适用于小型数据集,因为所有XML结构都经过解析并放入内存中。
在您的情况下,在解析大型XML文件时应该使用SAX方法,因为XML文件是逐行读取的,而不是一次读取所有内容。
谷歌有一些例子:https://www.google.lv/search?q=php+SAX+XML
答案在很大程度上取决于数据。一些可能的解决方案是将数据移动到MySQL这样的关系数据库中,或者将数据规范化为CSV这样的格式,这种格式更容易解析,占用的空间更小,并且可以逐行读取。
我并不特别熟悉PHP的实现,但是使用Xerces在C++中使用以下方法,我看到了您的场景的巨大性能改进。
与其按名称请求所有元素并等待返回整个NodeList,我发现只获取根节点下的第一个子节点,然后获取NextSibling节点要快得多。使用每个同级节点作为新节点,您将不断获得NextSibling,直到没有剩余节点为止。
希望这能像在C++中那样提高PHP的性能。