2012-07-30 83 views
4

嗨,我有一个xml文件,其中约12,000条记录。我编写的代码,它工作正常,只需要一段时间来解析XML文件并返回内容。有什么办法可以加快这个过程吗?加快xml解析与PHP

我的代码:

<?php 
$dom = new DOMDocument(); 
$dom->load('comics.xml'); 
foreach ($dom->getElementsByTagName('record') as $entry) 
{ 
$title = $entry->getElementsByTagName('title')->item(0)->textContent; 
echo $title; 

} 
?> 

XML文件(在那里只要1演示着联系他们所有的笑):

<?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> 
+0

第1步,找出什么是实际上很慢。关键字:剖析。 – salathe 2012-07-30 22:56:31

+0

你可以尝试xpath并比较结果吗?我认为这可能会更快,但我从未测试过。 – mrok 2012-07-30 22:56:39

+0

使用[XML Parser](http://www.php.net/manual/en/book.xml.php)。它将数据分成块,并且需要手动解析(基于事件),但它比DOMDocument或SimpleXML更有效(没有内部树被构建并卡入内存) – 2012-07-30 22:59:47

回答

1

答案取决于数据很多。一些可能的解决方案是将数据移动到像MySQL这样的关系数据库中,或者将数据规范化为像CSV这样的格式,这样更容易解析,占用更少的空间,并且可以逐行阅读。

+0

是的,我希望我可以避免将信息存储在数据库,但看起来这可能是我最好的解决方案。 – rackemup420 2012-07-30 23:23:26

+0

@ rackemup420你看我的答案吗?\ – 2012-07-30 23:57:38

0

我并不特别熟悉PHP实现,但是在使用Xerces的C++中使用以下方法我已经看到您的方案有了巨大的性能改进。

而不是按名称请求所有的元素,并等待返回一个完整的NodeList,我发现只要获得根节点下的第一个子节点并获取NextSibling节点就快得多了。使用每个兄弟节点作为新节点,您将继续获得NextSibling,直到没有剩下的节点。

希望这可以提供PHP性能改进,类似于C++中的改进。

2

DOM方法适用于小数据集,因为所有的XML结构都被解析并放入内存中。

在你的情况下,你应该在解析大型XML文件时使用SAX方法,因为XML文件是逐行读取的,而不是一次一行读取。

谷歌有一些例子:https://www.google.lv/search?q=php+SAX+XML